일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- til
- 파이썬
- 프로그래머스
- 손에 익히며 배우는 네트워크 첫걸음
- 자바스크립트
- 리트코드
- 4주 프로젝트
- 토익
- SQL 고득점 Kit
- javascript
- 타임어택
- 2주 프로젝트
- 리액트
- 코어 자바스크립트
- codestates
- HTTP
- 정재남
- 회고
- 알고리즘
- 렛츠기릿 자바스크립트
- LeetCode
- programmers
- 리덕스
- 타입스크립트 올인원
- 백준
- 제로초
- 코드스테이츠
- 타입스크립트
- python
- js
- Today
- Total
Jerry
#16. null, undefined, undeclared, NaN 본문
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가 됩니다.
'CS > Terminology' 카테고리의 다른 글
#17. HTML 렌더링 중에 JavaScript가 실행되면 렌더링이 멈추는 이유는? (0) | 2025.03.21 |
---|---|
#15. 실행 컨텍스트란? (0) | 2025.03.19 |
#14. 타입스크립트란? (0) | 2025.03.18 |
#13. 이벤트 전파 (0) | 2025.03.17 |
#12. 마이크로태스크 큐 vs 태스크 큐 (0) | 2025.03.16 |