Post

[JavaScript] null vs undefined 차이 제대로 알기

[JavaScript] null vs undefined 차이 제대로 알기

JavaScript 의 null, undefined 알아보기

undefined 의미

JavaScript에서 undefined변수를 선언하고 값을 할당하지 않은 상태를 의미합니다.

1
let x;


null 의미

null변수를 선언하고 빈 값을 할당한 상태입니다.

1
let x = null;


위 차이에 대해 구분하는 테스트하기(typeof 사용)

JavaScript에서는 typeof 라는 연산자가 있습니다.
이 연산자를 이용해서 타입들에 대해 볼 수 있는데 아래와 같이 Console 창에서 바로 확인 가능합니다.

1
2
3
4
typeof null         // 'object'
typeof undefined    // 'undefined'
typeof 1            // 'number'
typeof test         // 'string'

여기서 왜 nullobject 타입인지 궁금하신 분들이 계실겁니다.
nullobject 타입인 것은 자바스크립트의 초창기 설계 실수(버그) 때문에 typeof 연산자를 썼을 때 결과가 다르게 나오게 된 것입니다.

그럼 수정하면 되지 않나요? 라고 생각하실 수 있습니다. (저 또한 그랬죠)

당시 자바스크립트는 값을 내부적으로 태그(타입 태그)와 함께 저장했는데,
null의 태그가 0으로 설정되었고, 객체의 태그 또한 0으로 시작하는 비트 패턴을 사용했기 때문에 typeof null을 하면 object가 반환되게 된 거예요.

typeof null의 결과 값을 바꾸게 되면 기존 웹사이트의 수많은 코드가 깨져서 사이드 이펙트를 불러올 수 있어서 변경하지 못하고 있습니다ㅎㅎ;(웃픈 사실)

javascript 원시타입

하지만 nullundefined 타입에 관련된 내용은 ECMAScript 참고자료 링크를 통해서 확인할 수 있었습니다.

참고자료의 내용 중 이에 대해 언급하는 내용으로 다음과 같이 작성되어 있습니다.

1
A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, BigInt, String, and Symbol.


해석하자면,
원시타입(Primitive type) 값은 다음과 같은 내장 타입 중 하나에 속하는 값이다: Undefined, Null, Boolean, Number, BigInt, String, and Symbol.

여기서 우리는 nullundefinedPrimitive type 이라는 것을 알 수 있죠.

동등 비교(==) vs 일치 비교(===) 연산자 차이

nullundefined값이 없음을 나타냅니다.
따라서, null == undefined 를 하게 되면 true의 값을 얻게되죠.

그런데 null === undefined 의 경우에는 다릅니다.
위에서 살펴보았듯이 nullobject타입이고, undefinedundefined 타입이라는 것을 typeof을 통해 알게 되었었죠.

그러므로 결과는 당연히 null === undefinedfalse의 값을 얻게됩니다.

1
2
null == undefined   // true
null === undefined   // false


JSON.stringify 사용

객체일 때

1
const data = { name: undefined, age: null };

nameage 를 가진 객체 data 가 있다고 가정하겠습니다.
위의 결과를 출력하면

1
console.log(JSON.stringify(data)); // {"age":null}

undefined 로 지정된 name 이 사라진 것을 볼 수 있습니다.

왜 그런걸까요?

JSON 표준 문서

JSON 형식에서는 undefined라는 값이 존재하지 않고 있다는 것입니다.
위 내용에 대해서는 JSON 표준 ECMA-404 문서에서 확인 가능합니다.

하지만, 이 또한 친절한 잭슨씨가 내용을 갖고 왔습니다^^
위 내용을 확인해 보면, JSON 의 표준은 다음과 같이 표시된 것을 볼 수 있습니다.

  • 객체(Obejct)
  • 배열(Array)
  • 숫자(Number)
  • 문자열(String)
  • true, false
  • null

하지만, 배열일 때는 undefined가 포함됩니다! 단…

JSON 표준 문서에서 알아 봤듯이 JSON은 undefined를 허용하고 있지 않습니다.
그렇지만, 배열에 포함된 undefined 요소를 생략하면 순서가 깨지므로
JSON으로 변환 시 undefined -> null 로 변환하는 것이죠.

다음은 관련된 예시입니다.

1
2
3
4
5
const arr = [1, undefined, 3];
const json = JSON.stringify(arr);   // "[1,null,3]"
const parsed = JSON.parse(json);    // [1, null, 3]
console.log(arr[1]);                // undefined
console.log(arr.length);            // 3

결론

nullundefined의 차이는 값을 명시적으로 할당했는지 여부에 따라 구분된다는 점을 null의 의미undefined 의미에서 살펴보았습니다.

또한 undefined, null원시타입에 속하지만, typeof null의 결과가 object로 출력되는 것은 자바스크립트 초기 설계상의 실수라는 점도 확인했습니다.

그리고 동등 비교(==) vs 일치 비교(===) 연산자를 통한 차이로 null, undefined의 값과 타입 비교 차이를 이해했으며, JSON.stringify 사용 예시를 통해 객체배열에서 각각 어떻게 처리되는지도 알아보았습니다.

이 글이 이해에 도움이 되었길 바랍니다.
감사합니다!

This post is licensed under CC BY 4.0 by the author.