null과 undefined는 모두 JavaScript에서 "값이 없음" 또는 "정의되지 않음"을 나타내는 값이지만, 둘 사이에는 분명한 차이가 있다
null과 undefined 두 개념은 JavaScript의 타입 시스템에서 중요한 부분을 차지하며, 각자의 의미와 사용 목적이 다르다. null과 undefined의 차이를 알아보자.
undefined: 정의되지 않은 값
undefined는 JavaScript에서 "변수는 선언되었지만 값이 할당되지 않은 상태" 또는 "정의되지 않은 상태"를 의미한다.
undefined의 특징
- 자동 할당된 값: 선언만 하고 초기화하지 않은 변수는 자동으로 undefined 값을 가진다.
let a;
console.log(a); // undefined
- 함수의 인자: 함수 호출 시 인자를 전달하지 않으면 그 인자는 자동으로 undefined가 된다.
function test(a) {
console.log(a); // undefined
}
test();
- 리턴값이 없는 함수: 명시적으로 값을 반환하지 않는 함수는 기본적으로 undefined를 반환한다.
function test() {
// 아무것도 반환하지 않음
}
console.log(test()); // undefined
- 객체 속성/배열 요소가 존재하지 않을 때: 존재하지 않는 객체의 속성이나 배열의 요소에 접근하려고 하면 undefined가 반환된다.
const object = {};
console.log(object.someProp); // undefined
const array = [1, 2, 3];
console.log(array[5]); // undefined
- 타입: undefined는 JavaScript의 기본 타입 중 하나이며, 그 자체로 값을 가지고 있다.
- 의미: 변수가 선언되었지만 아직 값이 할당되지 않았다는 의미이다.
- 자동 할당: 변수를 선언하고 초기화하지 않거나 함수 호출 시 인자를 넘기지 않으면 자동으로 undefined가 할당된다.
null: 명시적인 "없음"
null은 JavaScript에서 "값이 없음" 을 명시적으로 나타내기 위해 사용되며, 프로그래머가 의도적으로 값이 없다는 것을 나타내기 위해 할당하는 값이다.
null 특징
- 명시적인 할당: null은 프로그래머가 명시적으로 변수에 값이 없다는 것을 표현하기 위해 직접 할당하는 값이다.
let a = null;
console.log(a); // null
- 객체를 가리키지 않음: null은 "객체가 없음을 나타내는 값"으로도 사용되며. 예를 들어, 객체에 대한 참조가 없음을 나타내기 위해 null을 할당할 수 있다.
let person = {
name: "Kim",
age: 38
};
person = null; // person이 더 이상 객체를 참조하지 않음
타입: null은 객체(Object) 타입의 특별한 값이며, JavaScript의 초기 설계 시 발생한 오류로 인해 발생한 결과이다.
null은 객체 타입이지만 실제로는 객체가 아니며, JavaScript의 설계 결함 중 하나로 여겨진다.
- 예를 들어, typeof null을 출력하면 "object"가 나온다. 하지만 null은 객체가 아니고, 특정 값이 없음을 나타낸다.
console.log(typeof null); // "object"
null과 undefined 차이점 비교
| 타입 | undefined (타입 자체가 undefined) | object (버그로 인해 객체로 표시됨) |
| 기본값/자동 할당 | 변수가 선언되었으나 초기화되지 않았을 때 | 명시적으로 "값이 없음"을 나타내기 위해 사용 |
| 의미 | 변수가 선언되었으나 값이 없음을 의미 | 명시적으로 "값이 없다"는 것을 나타냄 |
| 호출 시 함수 반환값 | 리턴 값이 없는 함수의 기본 반환 값 | 함수가 명시적으로 반환하는 값 |
| 프로그램 내 용도 | 값이 할당되지 않았음을 나타냄 | 의도적으로 빈 상태 또는 값이 없음을 표현 |
유사점과 동등 비교
- 유사점: 둘 다 값이 없음을 나타낸다는 점에서 유사하지만, undefined는 JavaScript 엔진에 의해 자동으로 할당되며, null은 프로그래머가 명시적으로 할당함.
- 동등 비교 (==)와 일치 비교 (===)
==로 비교할 경우 null과 undefined는 동등하다고 간주되며, 값이 없다는 의미에서는 같은 취급을 받는다.
console.log(null == undefined); // true
console.log(null === undefined); // false
undefined와 null에 대한 예시를 좀 봐보자.
undefined 함수에서 필수 인자가 전달되지 않았을 때
function test(name) {
if (name === undefined) {
console.log("Name is not provided!");
} else {
console.log("Hi, " + name);
}
}
test(); // Name is not provided!
변수 초기화 전 상태
let result;
console.log(result); // undefined
null API 호출에서 데이터가 존재하지 않음을 명시적으로 표현
function fetchUserInfo(id) {
// 사용자를 찾을 수 없을 때 null을 반환
if (id !== 1) {
return null;
}
return { id: 1, name: "Kim" };
}
let user = fetchUserInfo(2);
if (user === null) {
console.log("User not found!");
}
객체를 더 이상 참조하지 않을 때
let person = { name: "Kim" };
person = null; // person이 더 이상 참조되지 않음
결론적으로 undefined와 null에 차이는 이렇게 될것이다.
- undefined: JavaScript 엔진이 자동으로 할당하는 값이며, 변수가 선언되었지만 초기화되지 않았거나, 함수가 명시적인 반환 없이 종료되었을 때, 그리고 객체의 존재하지 않는 속성에 접근하려고 할 때 반환된다.
- null: 프로그래머가 "의도적으로 "값이 없다" 는 것을 표현하기 위해 할당하는 값이며, 주로 객체 참조가 없음을 나타내거나, 의도적으로 빈 상태를 나타낼 때 사용된다.
두 값의 차이를 이해하고 상황에 맞게 사용하자 !
2024.08.28 - [JavaScript] - [JavaScript] const, var , let 변수 선언 차이점
[JavaScript] const, var , let 변수 선언 차이점
JavaScript에서 const, let, var는 변수를 선언할 때 사용하는 키워드 이다. const, let, var 이 셋은 선언된 변수가 어떻게 동작하는지에 따라 중요한 차이점이 있으며, 간단하게 각각의 설명과 차이점을
ycds.tistory.com
2024.08.26 - [JavaScript] - [JavaScript] 호이스팅(Hoisting) 과 스코프(Scope)란?
[JavaScript] 호이스팅(Hoisting) 과 스코프(Scope)란?
JavaScript에서 호이스팅과 스코프는 변수와 함수의 동작을 이해하는데에 아주 중요한 개념이다. 코딩을 하기전에 한번쯤 생각 해봤으면 좋겠다 . (나포함) 우선 호이스팅부터 알아보자. 호이
ycds.tistory.com
2024.08.26 - [JavaScript] - [JavaScript] TDZ(Temporal Dead Zone)란?
[JavaScript] TDZ(Temporal Dead Zone)란?
2024.08.26 - [JavaScript] - [JavaScript] 호이스팅(Hoisting) 과 스코프(Scope)란? [JavaScript] 호이스팅(Hoisting) 과 스코프(Scope)란?JavaScript에서 호이스팅과 스코프는 변수와 함수의 동작을 이해하는데에 아주 중
ycds.tistory.com
'JavaScript' 카테고리의 다른 글
| [JavaScript] 서버사이드 렌더링(SSR) 클라이언트사이드 렌더링(CSR)? (4) | 2024.09.02 |
|---|---|
| [JavaScript] ES6란? (0) | 2024.08.30 |
| [JavaScript] const, var , let 변수 선언 차이점 (0) | 2024.08.28 |
| [JavaScript] TDZ(Temporal Dead Zone)란? (0) | 2024.08.26 |
| [JavaScript] 호이스팅(Hoisting) 과 스코프(Scope)란? (0) | 2024.08.26 |