null
과 undefined
는 볼 때마다 헷갈려서 다시 한번 정리를 하기로 했다.
undefined
는 자료형이 결정되지 않은 변수이고,
null
은 자료형은 객체인데, 비어있는 변수이다.
undefined
: 변수를 선언만 하고 값을 할당하지 않음. 즉, 자료형이 결정되지 않은 상태이다. (선언하지 않은 변수도 콘솔이나 기타 메시지에는undefined
라고 뜨지만,undefined
라는 값을 가지는 것은 아니다.)null
: 변수를 선언하고, 'null
'이라는 빈값을 할당한 경우이다.
(이 '빈값'의 경우, 자료형에 따라 여러 가지가 있지만,null
은 객체형 데이터(ex: array, object)의 빈값을 의미한다. 문자열(string)의 경우''
, 숫자(number)의 경우0
이 빈값이고, 이들 빈값 모두는 if문에서false
로 형 변환된다.)출처: null과 undefined의 차이 - Coding Story
빈값에 대해 이렇게 설명하니 null
과 ''
, 0
이 형 변환되었을 때 false
값을 갖는 이유가 이해되는 것 같다.
객체형을 제외한 다른 자료형은 문자열이든 숫자든 한 가지만 표현할 수 있어서 원시(primitive) 자료형이라 부릅니다. 반면 객체는 데이터 컬렉션이나 복잡한 개체(entity)를 표현할 수 있습니다.
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
typeof undefined // "undefined"
Math
는 내장 객체.typeof null
의 결과는 "object"
로 나오지만, 언어 자체의 오류. null
은 별도의 고유한 자료형을 가지는 특수 값으로 객체가 아니다.typeof
는 피연산자가 함수면 "function"
을 반환한다. 하지만 원래 함수는 객체형에 속하지 함수형이 따로 있는 것이 아니다. 이 또한 오류이지만 유용하게 사용되기도 한다. String(value)
// 변환 규칙
Number(undefined); // NaN
Number(null); // 0
Number(" 123 "); // 123
Number("123z"); // NaN ("z"를 숫자로 변환하는 데 실패함)
Number(true); // 1
Number(false); // 0
// 변환 규칙 (숫자 0, 빈 문자열, null, undefined, NaN과 같이 직관적으로도 “비어있다고” 느껴지는 값들은 false가 됩니다. 그 외의 값은 true로 변환됩니다.)
Boolean(1); // 숫자 1(true)
Boolean(0); // 숫자 0(false)
Boolean("hello"); // 문자열(true)
Boolean(""); // 빈 문자열(false)
Boolean("0"); // true
// 문자열 "0"과 " "같은 공백은 불린형으로 변환 시 true가 됩니다.