2022.7.13 koans과제
introduction
expect함수를 사용
expect(테스트하는값).기대하는조건 //to.be.true or false
expect('테스트하는값').to.equal('기대하는값');.equal은 두 값이 타입까지 엄격하게 같은지 검사한다
2.types-part1
비교연산자 '=='는 두 값의 일치 여부를 느슨하게 검사(loose equality)합니다. 우리는 '==='를 쓰는것이 옳다!
it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
expect(1 + '1').to.equal('11');
});
it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
expect(123 - '1').to.equal(122); //숫자처럼 문자인데도 불과하고 뺄셈으로 된다
});
it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
expect(1 + true).to.equal(2); //true가 1로 되어 합이 2가 된다
});
it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
expect('1' + true).to.equal('1true');
}); //둘다 문자열이라 붙어서 나온다
3.letconst
const로 선언된 변수에는 재할당이 금지!재선언도 금지된다
"const"로 선언된 객체,배열의 경우 새로운 요소를 추가하거나 삭제할 수 있습니다"
const obj = { x: 1 };
expect(obj.x).to.equal(1);
delete obj.x;
expect(obj.x).to.equal(undefined);
4.scope --*중요
let funcExpressed = 'to be a function';
expect(typeof funcDeclared).to.equal('function');
expect(typeof funcExpressed).to.equal('string');
function funcDeclared() {
return 'this is a function declaration';
}
funcExpressed = function () {
return 'this is a function expression';
};
js의 호이스팅이란?
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
var 변수 선언과 함수선언문에서만 호이스팅이 일어난다.
var 변수/함수의 선언만 위로 끌어 올려지며, 할당은 끌어 올려지지 않는다.
let/const 변수 선언과 함수표현식에서는 호이스팅이 발생하지 않는다.
그러므로 funcExpressed는 위에 let으로 선언이 되어있기에 밑에 함수로 호출이 안되는 것이다
it('lexical scope와 closure에 대해 다시 확인합니다.', function () {
let age = 27;
let name = 'jin';
let height = 179;
function outerFn() {
let age = 24;
name = 'jimin';
let height = 178;
function innerFn() {
age = 26;
let name = 'suga';
return height;
}
innerFn();
expect(age).to.equal(26);
expect(name).to.equal('jimin');//이거 중요! 그니까 위에서 바로 innerFn()이 실행되는 것이 아니고 밑에 const innerFn = outerFn();까지 간 후 그다음에 outer함수를 읽고 하는 것이기 때문에 name은 jimin이 되는 것이다.
return innerFn;
}
const innerFn = outerFn();
expect(age).to.equal(27);//age는 전역변수를 받아온다
expect(name).to.equal('jimin');
expect(innerFn()).to.equal(178);//inner안의 리턴값이 outer에 있기때문에 178이된다
});
});
6.typr-part2
원시 자료형을 변수에 할당할 경우, 값 자체의 복사가 일어납니다.
const nums1 = [1, 2, 3];
const nums2 = [1, 2, 3];
expect(nums1 === nums2).to.equal(false);//주소값이 다르기 때문!
```
7.array
const emptyArr = [];
expect(typeof emptyArr === 'array').to.equal(false);//object가 나옴
expect(emptyArr.length).to.equal(0);
만약 arr === []이렇게 하면 빈배열과 arr의 주소가 달라서 오류가 발생함!
const poppedValue = arr.pop();
expect(poppedValue).to.equal(3);//
expect(arr).to.deep.equal([1,2]);
>만약 pop이나 shift를 사용시 값은 지운 그 값자체가 값이된다 위에 3을 pop으로 지웠더니 그 값이 3이된 것처럼 말이다. 반대로 unshift나 push를 사용하면 이값은 이값이 더해진 길이가 값이다
expect(arr.slice(3, 0)).to.deep.equal([]);
expect(arr.slice(2, 2)).to.deep.equal([]);
이값에서 시작부분이 더크거나 둘의 값이 같으면 빈문자열로 반환된다.
얕은복사 vs깊은복사???이부분 다시
...이부분에서
num c = { }..
num d = c.slice().. 일때
d는 c가 복사되것이므로 주소값을 각각 가지고 있음 그러나 num c ={ㅁ,ㄴ,ㄹ...[주소값2]}처럼 배열이나 객체가 들어가있으면 새로운 주소값을 만드는데 이때 주소값은 d도 사용한다 즉 만약 c나 d가 주소값이 다르니 각각 안에있는 속성을 바꾸거나 사용하면 각각의 주소값에서 변하므로 c가 고쳐져도 d는 복제된거라 그대로 남는데 만약 안에있는 주소값2가 바뀐다면 이건 둘다 공유하고 있으므로 둘다 바뀐다!!!!이부분 다시하자
객체에서 key.length =>0~이 나옴
그러나 객체.length하면 undefined가나온다
이이후에 확장하고 분해는 다시!