
먼저 undefined와 reference error의 차이를 알아보자.

1. 변수가 선언되었으나 어떤 값도 할당되지 않았을 경우 undefined 이다.
2. 변수/함수가 정의내려지지 않은 상태에서 사용하려 하면 reference error 가 반환된다.
결국 선언되긴 했는데 값이 없을 경우 undefined,
선언도 하지 않고 (정말 아무것도 없는데) 무작정 쓰면 ref. error인 듯 하다.

얼핏보면 작동할 것 같은 함수이지만,
이렇게 쓸 경우 console에는 reference error 메세지가 출력된다. (a is not defined)
a라는 변수는 선언된 블럭(아래 영역) 내에서만 유효하기 때문이다.
if (true) { // 여기서부터
const a = 123
} // 여기까지.
하여, 아래와 같이 고쳐야 작동한다.
function scope() {
if (true) {
const a = 123
console.log(a) //console.log(a)가 if 문 안, const ~ 아래로 들어왔다.
}
}
scope()
function scope() {
if (true) {
console.log(a) //console.log(a)가 const 위에 위치해있다.
const a = 123
}
}
scope()
console.log(a)가 const a = 123 보다 먼저 읽히는 구조이다.
즉 console.log 시점에는 a가 선언되지 않았다. 그렇지만 구조상 같은 블럭 내에 있다.
(= 같은 블럭 내 선언되었음은 확인 가능하나, 값은 확인할 수 없다.)
그러므로 console 창에는 undefined가 출력된다.
function scope() {
console.log(a) //console.log(a)가 if문 전에 적혀있다.
if (true) {
const a = 123
}
}
scope()
위와 비슷해보이지만 결과는 다르다.
console.log(a)가 if문 전에 위치하여 a가 선언된 범위 밖에 있으므로,
reference error가 뜨게 된다.
= 메모리 누수로 이어질 수 있음.
function scope() {
if (true) {
var a= 123
console.log(a)
}
}
scope()
console 창에서 123이 출력된다.
function scope() {
if (true) {
console.log(a)
var a= 123
}
}
scope()
1.의 2)와 같이 undefined. (=선언되긴 했는데 값이 없을 경우)
function scope() {
console.log(a)
if (true) {
var a= 123
}
}
scope()
위의 경우는 1.의 3)에서 const를 var로 바꾼 것이다.
여기는 reference error가 아닌 undefined가 출력된다.
var는 함수 범위내 유효하다는 첨 다시 참고.
== 동등연산자.위를 사용하게 되면 1과 '1'이 같다고 하기 때문에,
의도치 않게 서로 다른 값이 동일(===)하다고 생각할 수 있음.
(값은 같음. 다만 하나는 문자데이터고 한쪽은 숫자데이터라 다름.)
그러므로 JS 에서는 동등연산자는 피해야.

truthy: 참 같은 값 (매우 다양한 케이스)
falsy: 거짓 같은 값 (한정적인 케이스)