내 방식대로 이해한 내용은 초록색으로 필기!
=== (엄격한 비교연산자)
, ==(느슨한 동치연산자)
expect(0 == false).to.be.true;
expect(![] == false).to.be.true;
expect([0] == 0).to.be.true;
느슨한 비교연산자의 경우 타입이 달라도 값이 같은 경우 참으로 판단하기 때문에 주의해야 함
+
,-
,/
,*
expect(1 + '1').to.equal('11'); //숫자 + 문자열 = 문자열
expect(123 - '1').to.equal(122); //숫자 - 문자열 = 숫자
expect(1 + true).to.equal(2); //숫자 + boolean = 숫자
expect('1' + true).to.equal('1true'); //문자 + boolean = 문자
이때, 타입이 같은 값끼리 연산해주지 않으면 의도치 않은 결과값을 받을 수 있다
가능한 엄격한 동치 연산자를 사용하고, 같은 타입끼리 사용해야 결과값 예측이 쉽다
const arr = [];
const toBePushed = 42;
arr.push(toBePushed);
expect(arr[0]).to.equal(42);
하지만 새로운 요소를 추가하거나 삭제하는 것은 가능하다
[참조] 선언 키워드 확인 https://google.github.io/styleguide/jsguide.html#features-use-const-and-let
let funcExpressed = 'to be a function';
function funcDeclared() {
return 'this is a function declaration'; //선언식
}
funcExpressed = function () {
return 'this is a function expression'; //표현식
};
//함수 선언식의 경우
greeting(); // 'Hello'
function greeting() {
console.log('Hello');
}
greeting(); // 'Hello'
---
//함수 표현식의 경우
greeting(); // Error
var greeting = function greetingFunc() {
console.log('hi');
}
greeting(); // 'hi'
함수 선언식의 경우, 함수가 선언되기 전의 출력식에 정상적으로 값이 출력이 된 것을 볼 수있다.이렇게 함수 선언식의 경우 호이스팅되는 현상이 있음을 알 수 있다
하지만 함수 표현식의 경우 var 변수에 할당된 함수보다 앞선 출력식은 Error가 뜨는 것을 확인할 수 있다. var의 경우 선언은 호이스팅 되어 맨 위로 끌어올려지나 할당된 값은 호이스팅되지 않아 값을 찾을 수 없기 때문에 함수 표현식은 호이스팅 되지 않는다는 것을 알 수 있다
var x = 1;
function outer() {
var x = 2;
function inner() {
console.log(x)
}
inner();
}
outer();
lexical 스코프
는 스코프를 선언된 위치를 기준으로 정한다.
따라서 함수 내부에 선언된 inner함수의 x의 값을 찾을때, 1. 자신이 선언된 스코프inner()
> 2. 자신이 선언된 스코프의 가장 가까운 외부 스코프outer()
> 3. 전역 스코프 순으로 참조하여 변수의 값을 찾기 때문에 inner의 x값은 2가 된다는 것을 알 수 있다
function defaultParameter(num = 5) {
return num;
}
defaultParameter(); // 5
defaultParameter(10) // 10
선언된 함수의 매개변수에 초기값이 할당된 경우, 함수를 호출할 때 매개변수에 전달된 인자가 없으면 초기값을 뱉어낸다. 매개변수에 전달된 인자가 있으면 초기값을 무시하고 전달된 인자를 사용한다
lexical scope
에 따라 각 스코프에 선언된 변수가 접근할 수 있는 범위가 나누어지는 현상 function init() {
var name = "Mozilla"; // name은 init에 의해 생성된 지역 변수이다.
function displayName() { // displayName() 은 내부 함수이며, 클로저다.
alert(name); // 부모 함수에서 선언된 변수를 사용한다.
}
displayName();
}
init();
내부함수는 외부 함수의 변수를 사용할 수 있지만 그 반대의 경우는 불가하다
function outerFn() {
let age = 24;
name = 'jimin';
let height = 178;
function innerFn() {
age = 26;
let name = 'suga';
return height;
}
}
expect(age) //inner에서 age는 26으로 재할당이 됨
expect(name) //outer에서 name이 jimin으로 재할당 됨
return innerFn;
내부함수에서 재선언된 변수는 외부함수에서 사용할 수 없지만 재할당되는 경우에는 내부함수의 값이 외부함수의 재할당값에 전달되기 때문에 사용할 수 있게 됨
const add = function (x, y) {
return x + y
}
---
const add = (x, y) => { //const 함수이름 = (매개변수) => {실행문}
return x + y
}
---
const add = (x, y) => x + y
---
const adder = x => {
return y => {
return x + y
}
---
const adder = x => y => {
return x + y
}
위의 다섯 코드는 모두 의미가 같은 코드로 볼 수 있다
이때 let addfunc = adder(5)
로 변수의 값을 할당하면 adder함수의 x에 5의 값을 넣은 상태로 저장된다 adder(5)(7)
혹은 adderfunc(7)
와 같이 사용하여 값을 도출할 수 있다
const htmlMaker = tag => textContent => `<${tag}>${textContent}</${tag}>`
htmlMaker('div')('content') //`<${'div'}>${'content'}</${'div'}>`
const divMaker = htmlMaker('div');
앞서 x의 값이 전달된 상태로 저장된다고 했는데 이를 유용하게 쓸 수 있는 위와 같은 예시가 있다 divMaker 변수에 div값을 넣은 htmlMaker함수를 할당해두고 div영역을 만들고 싶을 때 마다 얼마든지 꺼내어 쓸 수 있다