1.9null과 undefined
JavaScript에서 null과 undefined의 정의와 차이
TL;DR
추억의 쪽지 시험
1. 정의와 주요 차이
둘 다 JavaScript에서 '값이 없음'을 나타내고, 둘 다 Primitive Value이라는 공통점이 있다.
세부적으로 들어가면 차이가 있는데, undefined
는 값이 할당되지 않은 상태인 반면, null
은 의도적으로 비어있는 값임을 표현한다. 따라서 undefined
는 아예 선언조차 하지 않았거나, 선언만 하고 값을 할당하지 않은 변수에 자동으로 할당되는 반면, null
은 값이 없음을 명시적으로 나타내기 위해 쓴다.
만약 변수 foo를 정의조차 하지 않은 경우,
javascriptfoo; // ReferenceError: foo is not defined
만약 foo를 정의했는데 빈 값을 할당했다면,
javascriptconst foo = null; foo; //null
2. 예시
javascriptfunction updateProfile(user, newName) { // newName이 undefined인 경우: 인수가 전달되지 않아 기존 이름을 유지한다. if (newName === undefined) { console.log("새 이름이 제공되지 않았으므로 기존 이름을 유지합니다:", user.name); } // newName이 null인 경우: 사용자가 의도적으로 이름을 없애는 경우. else if (newName === null) { console.log("사용자가 이름을 삭제하고자 합니다."); user.name = ""; // 또는 null로 할당하여 '값이 없음'을 표시한다. } // 그 외의 경우: 새로운 이름으로 업데이트한다. else { console.log("사용자 이름을 업데이트합니다:", newName); user.name = newName; } return user; } let user = { name: "Alice" }; // 1. 이름을 업데이트하지 않음: newName이 undefined updateProfile(user, undefined); console.log(user); // { name: "Alice" } // 2. 이름을 삭제함: newName이 null updateProfile(user, null); console.log(user); // { name: "" } // 3. 이름을 'Bob'으로 업데이트함 updateProfile(user, "Bob"); console.log(user); // { name: "Bob" }
3. 주의점
타입 체크를 할 때 ==
와 ===
를 쓰곤 하는데, 후자를 써야하는 이유가 여기에도 있다. null
과 undefined
를 비교할 때, ==
으로 비교하면 둘은 같다고 나오기 때문이다. 아래는 MDN에서 제공하는 예시들이다.
javascripttypeof null; // "object" (not "null" for legacy reasons) typeof undefined; // "undefined" null === undefined; // false null == undefined; // true null === null; // true null == null; // true !null; // true Number.isNaN(1 + null); // false Number.isNaN(1 + undefined); // true
undefined
와 null
이 모두 Primitive Value라고 했는데, typeof(undefined)
는 undefined
인데 typeof(null)
은 object
이다.
이 이유는 MDN 공식문서에도 나와있는데, 자바스크립트 초창기에, 자바스크립트의 값들은 type tag와 value로 표현되었다. Object들의 type tag는 0이었는데, null
은 NULL pointer(대부분의 플랫폼에서 0x00
)로 표현되었다. 이로 인해 null
의 type tag가 0으로 잡혔고, typeof
안에 넣으면 object
가 반환되게 되었다. 이후 typeof(null)
을 null
로 바꾸자는 수정안이 제안되었지만, 기각되어서 오늘날에 이른다.