## undefined와 null
null과 undefined 모두 '값이 없음'을 나타내지만 의미와 사용 목적이 다르다.
## undefined
undefined는 **값이 할당되지 않은 상태**를 의미한다.
- 변수를 선언만 하고 값을 할당하지 않았을 때
- 함수에서 명시적으로 값을 반환하지 않았을 때
- 객체에 존재하지 않는 프로퍼티에 접근했을 때
- 함수 매개변수에 값을 전달하지 않았을 때
이런 경우에 **엔진이 자동으로 할당하는 값**이 undefined이다.
- 변수나 프로퍼티가 정의되엇는지 확인할 때
- 함수 매개변수의 기본값을 설정할 때
- 옵셔널 체이닝으로 안전하게 프로퍼티에 접근할 때
이런 상황에서 undefined를 활용할 수 있다.
## null
null은 **값이 없음을 의도적으로 나타내는 상태**이다.
undefined와는 다르게 null은 **개발자가 직접 할당하는 값**이고, 보통
- 명시적으로 값이 없음을 표현하고 싶을 때
- 객체를 초기화 할 때 빈 값으로 설정해야 하는 경우
- API 응답에서 값이 없음을 명시적으로 표현할 때
이런 상황에서 주로 null을 할당한다.
- 객체 참조를 명시적으로 해제해서 가비지 컬렉션의 대상으로 만들거나
- API의 빈 값을 명시적으로 표현하거나
- 변수의 초기값으로 사용해서 나중에 실제 값이 할당될 것임을 암시해야 하는 경우
이런 상황에서 null을 활용할 수 있다.
## 타입과 동등성 비교
```javascript
typeof undefined // "undefined"
typeof null // "object" (JavaScript의 유명한 버그)
undefined == null // true (느슨한 비교)
undefined === null // false (엄격한 비교)
```
<!--todo: typeof null 의 결과가 object가 나오는 것은 실수일까 의도일까 -->
> [!note]- 실제 실행 결과
> ![[39cd4546-f600-428b-97ac-7cd37f017408.png]]
> ![[4a78f065-9aca-481b-a8ef-d08e7a5288d7.png]]
## best practice
- null과 undefined를 일관성 있게 사용하되 undefined는 엔진이 자동으로 할당하는 방향, null은 개발자가 직접 할당하는 방향으로 사용하는 것이 좋다
- 타입 체크할 때 엄격한 비교(`===`)를 사용하는 것이 좋다.