06 undefined와 null
undefined
undefined이 부여되는 경우
undefined는 사용자가 명시적으로 지정할 수도 있지만 값이 존재하지 않을 때 자바스크립트 엔진이 자동으로 부여하는 경우도 있다. 아래와 같은 경우가 이에 해당한다.
- 값을 대입하지 않은 변수, 즉 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때
- 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
- return 문이 없어나 호출하지 않는 함수의 실행 결과
// (1) 값을 대입하지 않은 변수에 접근할 때
let a;
console.log(a); //undefined
//(2) 존재하지 않는 프로퍼티에 접근
const obj = { a: 1 };
console.log(obj.a); // 1
console.log(obj.b); // undefined
console.log(b); // c.f) ReferenceError: b is not defined
// (3) 반환값이 없으면 undefined를 반환한 것으로 간주
const func = () => {};
const c = func();
console.log(c); // undefined
undefined와 empty
const arr1 = [];
arr1.length = 3;
console.log(arr1); // [ empty x 3 ]
const arr2 = new Array(3);
console.log(arr2): // [ empty x 3 ]
const arr3 = [ undefined, undefined, undefined ];
console.log(arr3); // [ undefined, undefined, undefined ];
arr1이나 arr2처럼 [ empty x 3 ]가 출력되는 경우는 배열의 값이 들어갈 주소가 확보되었으나 아무런 값도 할당되지 않았음을 의미한다.
const arr = [undefined, 1];
arr.map(v=>console.log(v)); // undefined 1
const arr2 = new Array(3);
arr2.map(v=>console.log(v)); // 아무것도 출력되지 않음
console.log(arr2) // [ <3 empty items> ]
위의 예시로 보듯이 undefined이 들어간 배열은 순회가 되지만, empty인 경우는 순회 자체가 안된다. undefined은 비어있는 요소라는 값이 할당된 것이지만 empty는 아무런 값도 존재하지 않는 것이기 때문이다.