undefined & null

1. κ°œμš”

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ—†μŒμ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 데이터 νƒ€μž…μ€ undefined와 null이닀. 이 λ‘κ°œμ˜ 차이λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 문득 μ€‘μš”ν•˜λ‹€κ³  μƒκ°λ˜μ–΄ μ •λ¦¬ν•œλ‹€.


2. undefined

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜ 선언을 λ‹€μŒκ³Ό 같이 2단계에 거쳐 μˆ˜ν–‰ν•œλ‹€.

  1. μ„ μ–Έ 단계: λ³€μˆ˜ 이름을 λ“±λ‘ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦°λ‹€.

  2. μ΄ˆκΈ°ν™” 단계: 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ήν•΄ μ΄ˆκΈ°ν™”ν•œλ‹€.

즉, undefinedλŠ” κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ ν• λ‹Ήν•˜κΈ° μœ„ν•œ 값이 μ•„λ‹ˆλΌ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 값이닀. 이후 κ°œλ°œμžμ— μ˜ν•΄ λ³€μˆ˜μ— νŠΉμ • 값이 할당이 λœλ‹€. μ•„λž˜μ˜ 예제λ₯Ό μ‚΄νŽ΄λ³΄μž.

let foo;
foo; // undefined

let obj = {};
obj.prop; // undefined

foo λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” λ‹¨κ³„λ§Œ 거쳀을 뿐 νŠΉμ • 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ•˜κ³  obj 객체의 속성 쀑 propλ˜ν•œ νŠΉμ • 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ•„ undefined둜 μ΄ˆκΈ°ν™”λœλ‹€. 이처럼 λ³€μˆ˜ 선언에 μ˜ν•΄ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간을 처음 할당이 μ΄λ€„μ§ˆ λ•ŒκΉŒμ§€ 빈 μƒνƒœλ‘œ 내버렀두지 μ•Šκ³  μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 undefined둜 μ΄ˆκΈ°ν™”ν•œλ‹€. λ”°λΌμ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 이후 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.


3. null

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ null은 λ³€μˆ˜μ— 값이 μ—†λ‹€λŠ” 것을 μ˜λ„μ μœΌλ‘œ λͺ…μ‹œν•  λ•Œ μ‚¬μš©ν•œλ‹€. 즉, λ³€μˆ˜μ— null을 ν• λ‹Ήν•˜λŠ” 것은 λ³€μˆ˜κ°€ 이전에 μ°Έμ‘°ν•˜λ˜ 값을 더 이상 μ°Έμ‘°ν•˜μ§€ μ•Šκ² λ‹€λŠ” 것이닀.

let name = 'hd';

name = null;

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 것은 null νƒ€μž…μ€ κ°œλ°œμžκ°€ 집적 값이 μ—†λ‹€λŠ” 것을 λͺ…μ‹œν•œλ‹€λŠ” 것이닀.


4. κ°œλ°œμžλ“€μ΄ 값이 μ—†λ‹€λΌλŠ” 것을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„ ...? undefined vs null

κ·Έλ ‡λ‹€λ©΄ 값이 μ—†λ‹€λΌλŠ” 것을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ κ°œλ°œμžλ“€μ€ μ–΄λ–€ 데이터 νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ? undefined일까? null일까?

정닡은 null이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” undefinedλ₯Ό κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€λ©΄ undefined의 본래 취지와 μ–΄κΈ‹λ‚ λΏλ”λŸ¬ ν˜Όλž€μ„ 쀄 수 μžˆλ‹€. 즉, 값이 μ—†λ‹€λΌλŠ” 것을 λͺ…μ‹œμ μœΌλ‘œ λΆ€μž¬λ₯Ό λ‚˜νƒ€λ‚΄κ³  싢을 땐 nullλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

λ‹€λ§Œ, 객체λ₯Ό μ‚¬μš©ν•  λ•Œ μ–΄λ–€ μ†μ„±μ˜ λΆ€μž¬λ₯Ό null을 ν†΅ν•΄μ„œ λ‚˜νƒ€λ‚΄λŠ” μͺ½λ³΄λ‹€λŠ”, κ·Έλƒ₯ κ·Έ 속성을 μ •μ˜ν•˜μ§€ μ•ŠλŠ” 방식이 κ°„νŽΈν•˜λ―€λ‘œ 더 널리 μ‚¬μš©λœλ‹€.

// good, ν”μΉ˜ μ•Šλ‹€.
{
  name: 'HD';
  address: null;
}

// very Good
{
  name: 'HD';
}

// bad
{
  name: 'HD';
  address: undefined;
}

5. Conclusion

μ§€κΈˆκΉŒμ§€μ˜ ν”„λ‘œμ νŠΈλ₯Ό λŒμ•„λ³΄λ©΄ λ‚œ undefinedλ₯Ό 자주 μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν–ˆμ—ˆλ‹€. null도 μ‚¬μš©ν–ˆμ§€λ§Œ κ·Έ λ‘˜μ˜ 차이λ₯Ό λͺ¨λ₯Έμ±„ λ‘˜ λ‹€ 값이 μ—†λ‹€λΌλŠ” κ²ƒλ§Œ μΈμ§€ν•˜κ³  μ‚¬μš©ν–ˆμ—ˆλ‹€. λΆ€λ„λŸ¬μš΄ 기뢄이 λ“ λ‹€. λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ˜ 이유λ₯Ό λͺ¨λ₯Έλ‹€λŠ” 것은 아직 많이 λΆ€μ‘±ν•˜λ‹€λŠ” 것이닀. 였늘의 κ³΅λΆ€λ‘œ 인해 undefined와 null의 차이λ₯Ό μ•Œκ²Œ λ˜μ—ˆμœΌλ―€λ‘œ μ•žμœΌλ‘œ 상황에 맞게 잘 κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©ν•˜λ„λ‘ ν•˜μž. λ˜ν•œ 잘λͺ» μ‚¬μš©ν•˜κ³  μžˆλŠ” λΆ„λ“€μ—κ²Œλ„ μΉœμ ˆν•˜κ²Œ μ„€λͺ…ν•˜μž:)


μ°Έκ³ 

λ„μ„œ - λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive nullκ³Ό undefined


πŸ“… 2023-01-03

Last updated