관리 메뉴

Jerry

#16. null, undefined, undeclared, NaN 본문

CS/Terminology

#16. null, undefined, undeclared, NaN

juicyjerry 2025. 3. 20. 18:26
반응형

 

Q. null, undefined, undeclared, NaN에 대해 설명하시오

 

 

 

 

 

 

 

 

Answer

null, undefined, undeclared, NaN은 모두 자바스크립트에서 값이 없거나 잘못된 값을 나타내는 경우에 사용됩니다.

null은 개발자가 의도적으로 "값이 없음"을 표현할 때 사용하며,

undefined는 변수가 선언되었으나 초기화되지 않았을 때 기본값이며,

undeclared는 아예 선언되지 않은 변수를 참조할 때 발생하며, ReferenceError가 발생합니다.

NaN은 수학 연산이 실패했을 때 나타나는 특수한 값으로, 자기 자신과 같지 않은 유일한 값입니다.

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

자바스크립트에서는 null, undefined, undeclared, NaN이 서로 다른 의미를 가지며, 각각 특정한 상황에서 사용됩니다.

 

 

 

 

 

 

 

 

 

null

- 의도적으로 "값이 없음"을 나타내는 값

- 해당 변수에는 아무런 값도 존재하지 않음을 명시적으로 나타냄

- typeof null은 "object"를 반환하는데, 이는 초기 자바스크립트 버전의 버그이며 현재까지 수정되지 않고 유지되고 있음

 

 

 

 

 

 

 

 

 

 

undefined

- 변수가 선언되었지만, 값이 할당되지 않은 상태

- var 또는 let 키워드로 변수를 선언하면 기본적으로 undefined로 초기화

- 함수에서 명시적으로 값을 반환하지 않으면 undefined가 반환

 

const 키워드로 변수 선언하면 에러 나는 이유
- const는 상수(constant) 선언을 위한 키워드이며, 선언과 동시에 초기화가 반드시 필요하다. (초기화되지 않은 변수 선언을 허용하지 않음)

 

// 예외적으로 변경 가능한 const
const obj = { name: "Alice" };
obj.name = "Bob"; // 가능! (객체 내부 값 변경 가능)

// const로 선언한 객체나 배열은 참조(reference) 자체를 변경할 수 없지만, 내부 값을 변경할 수 있음.

 

 

const로 객체를 선언하면 내부 값을 변경할 수 있는 이유는?

 

const는 참조값(reference)를 고정할 뿐, 객체 내부의 값은 변경할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

undeclared

- 변수를 선언하지 않고 사용하면 undeclared 상태가 되어 ReferenceError가 발생

- 아예 선언되지 않은 변수를 의미

- 선언되지 않은 변수를 참조하면 undeclared 상태가 되어 ReferenceError가 발생

 

* 예외적으로. var, let, const 없이 전역에서 변수를 할당하면 자동으로 window 객체에 등록되며, 이는 암묵적 전역 변수가 됨

  > use strict 모드에서는 선언되지 않은 변수에 값을 할당하면 ReferenceError가 발생

console.log(notDeclaredVar); // ReferenceError: notDeclaredVar is not defined

 

 

 

 

 

 

 

 

 

 

 

 

NaN (Not a Number)

- 숫자가 아닌 값이 숫자로 연산될 때 발생하는 값

- typeof NaN은 "number"를 반환하지만, 실제로는 유효한 숫자가 아님

- NaN은 자신과 같지 않은 유일한 값 (자기 자신과 비교해도 false가 나오는 유일한 값)

 

console.log(typeof NaN); // "number"
console.log(NaN === NaN); // false (NaN은 자기 자신과 같지 않음)
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(NaN)); // true

console.log(0 / 0); // NaN
console.log(parseInt("hello")); // NaN
console.log(Math.sqrt(-1)); // NaN

 

 

 

 

 

 

 

 

 

 

 

 

정리

정의 typeof 반환값 주요 특징
null 값이 없음을 명시적으로 표현 "object" (버그) 의도적으로 값이 없음을 나타냄
undefined 선언은 되었지만 값이 없음 "undefined" 값이 할당되지 않은 변수의 기본값
undeclared 아예 선언되지 않은 변수 ReferenceError 변수가 존재하지 않음
NaN 숫자가 아님(Not a Number) "number" 연산 결과가 숫자가 아닐 때 발생

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

null과 undefined의 차이는 무엇인가요?

 

null은 의도적으로 값이 없음을 표현하는 반면, undefined는 값이 할당되지 않았을 때 자동으로 부여되는 값

 

 

 

 

 

 

 

 

 

 

 

 

 

 

typeof null이 "object"를 반환하는 이유는?

 

 

이는 초기 자바스크립트 구현에서 발생한 버그이며, 하위 호환성을 위해 수정되지 않고 유지되고 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NaN은 왜 자기 자신과 같지 않나요?

 

IEEE 754 부동소수점 연산 규칙에 따르면, NaN은 비교 불가능한 값이므로 NaN === NaN은 false를 반환합니다.

 

IEEE 754 부동소수점 연산 규칙
- 컴퓨터에서 부동소수점(실수)를 표현하는 방식을 정한 표준
- 2진법(0과 1)으로 실수를 표현해야 하므로, 일부 실수를 정확하게 표현할 수 없음
- 반올림 오차가 발생할 수 있음
- NaN과 IEEE 754에서 NaN(Not a Number)은 비교할 수 없는 값으로 정의되어 있음
- NaN === NaN이 false를 반환하는 이유도 여기에 있음.
// 0.1과 0.2를 이진수로 변환하면 무한소수가 발생하여 정확한 표현이 어려움
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false


// 반올림 오차를 방지하려면 toFixed() 또는 Math.round()를 사용할 수 있음

 

 

 

 

 

 

 

 

 

 

 

 

isNaN()과 Number.isNaN()의 차이는?

 

 

isNaN()은 입력값을 숫자로 변환한 후 NaN인지 판단하기 때문에 isNaN("hello")는 true가 됩니다.

Number.isNaN()은 입력값이 정확히 NaN인지 확인하므로, Number.isNaN("hello")는 false를 반환합니다.

 

 

console.log(isNaN("hello")); // true (암묵적 변환 후 NaN)
console.log(Number.isNaN("hello")); // false (문자열이 NaN이 아님)

 

 

 

 

 

 

 

 

 

IEEE 754 부동소수점 연산 규칙이란?

 

- IEEE 754 표준은 컴퓨터에서 부동소수점을 표현하는 방식을 정한 규칙으로, 실수를 정확히 표현할 수 없는 반올림 오차가 발생할 수 있습니다. 예를 들어, 0.1 + 0.2는 0.3이 아니라 0.30000000000000004가 됩니다.

 

 

 

 

 

 

 

 

 

반응형