sungyup's.

Web_Miscellaneous / 기초 개념 / 1.9 null과 undefined

1.9null과 undefined

JavaScript에서 null과 undefined의 정의와 차이

TL;DR

추억의 쪽지 시험

1. 정의와 주요 차이

둘 다 JavaScript에서 '이 없음'을 나타내고, 둘 다 Primitive Value이라는 공통점이 있다.

세부적으로 들어가면 차이가 있는데, undefined값이 할당되지 않은 상태인 반면, null의도적으로 비어있는 값임을 표현한다. 따라서 undefined는 아예 선언조차 하지 않았거나, 선언만 하고 값을 할당하지 않은 변수에 자동으로 할당되는 반면, null값이 없음을 명시적으로 나타내기 위해 쓴다.

만약 변수 foo를 정의조차 하지 않은 경우,

javascript
foo; // ReferenceError: foo is not defined

만약 foo를 정의했는데 빈 값을 할당했다면,

javascript
const foo = null; foo; //null

2. 예시

javascript
function 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. 주의점

타입 체크를 할 때 =====를 쓰곤 하는데, 후자를 써야하는 이유가 여기에도 있다. nullundefined를 비교할 때, ==으로 비교하면 둘은 같다고 나오기 때문이다. 아래는 MDN에서 제공하는 예시들이다.

javascript
typeof 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

undefinednull이 모두 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로 바꾸자는 수정안이 제안되었지만, 기각되어서 오늘날에 이른다.