본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 1: 데이터 νƒ€μž…

πŸ“š 데이터 νƒ€μž…μ˜ μ’…λ₯˜β€‹

  • κΈ°λ³Έν˜•(μ›μ‹œν˜•)
    • 숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έ(boolean), null, undefined, Symbol(ES6)
  • μ°Έμ‘°ν˜•
    • 객체, λ°°μ—΄, ν•¨μˆ˜, λ‚ μ§œ, μ •κ·œν‘œν˜„μ‹
    • ES6: Map, WeakMap, Set, WeakSet
  • κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ„ κ΅¬λΆ„ν•˜λŠ” 기쀀은 κΈ°λ³Έν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’μ„ λ°”λ‘œ λ³΅μ œν•˜λŠ” 반면 μ°Έμ‘°ν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’λ“€λ‘œ 이루어진 λ¬ΆμŒμ„ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Ÿκ°’μ„ λ³΅μ œν•œλ‹€.

πŸ“š 데이터 νƒ€μž…μ— κ΄€ν•œ 배경지식​

🎈 λ©”λͺ¨λ¦¬μ™€ 데이터​

  • 각 λΉ„νŠΈλŠ” κ³ μœ ν•œ μ‹λ³„μžλ₯Ό μ§€λ‹Œλ‹€. λ°”μ΄νŠΈ μ—­μ‹œ μ‹œμž‘ν•˜λŠ” λΉ„νŠΈμ˜ μ‹λ³„μžλ‘œ μœ„μΉ˜λ₯Ό νŒŒμ•…ν•œλ‹€.
  • λͺ¨λ“  λ°μ΄ν„°λŠ” λ°”μ΄νŠΈ λ‹¨μœ„μ˜ μ‹λ³„μž, 더 μ •ν™•ν•˜κ²ŒλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Ÿκ°’μ„ 톡해 μ„œλ‘œ κ΅¬λΆ„ν•˜κ³  μ—°κ²°ν•  수 μžˆλ‹€.

🎈 μ‹λ³„μžμ™€ λ³€μˆ˜β€‹

  • λ³€μˆ˜λŠ” λ³€ν•  수 μžˆλŠ” 수둜 값이 λ°˜λ“œμ‹œ μˆ«μžμ—¬μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. 즉, λ³€ν•  수 μžˆλŠ” λ¬΄μ–Έκ°€λΌλŠ” 뜻으둜, μ—¬κΈ°μ„œ λ¬΄μ–Έκ°€λž€ 데이터λ₯Ό λ§ν•œλ‹€. 숫자, λ¬Έμžμ—΄, 객체, λ°°μ—΄ λ“±λ“±.
  • μ‹λ³„μžλŠ” μ–΄λ–€ 데이터λ₯Ό μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” 이름, 즉 λ³€μˆ˜λͺ…이닀.

πŸ“š λ³€μˆ˜ μ„ μ–Έκ³Ό 데이터 할당​

🎈 λ³€μˆ˜ 선언​

var a;
  • μœ„ μ˜ˆλŠ” *λ³€ν•  수 μžˆλŠ” 데이터λ₯Ό λ§Œλ“ λ‹€. 이 λ°μ΄ν„°λŠ” μ‹λ³„μžλŠ” a둜 ν•œλ‹€.*라고 말할 수 μžˆλ‹€.
  • λ³€μˆ˜λž€ κ²°κ΅­ λ³€κ²½ κ°€λŠ₯ν•œ 데이터가 λ‹΄κΈΈ 수 μžˆλŠ” 곡간 λ˜λŠ” 그릇이라고 ν•  수 μžˆλ‹€.
  • 예제의 λͺ…령을 받은 μ»΄ν“¨ν„°λŠ” λ©”λͺ¨λ¦¬μ—μ„œ λΉ„μ–΄μžˆλŠ” 곡간 ν•˜λ‚˜λ₯Ό ν™•λ³΄ν•œλ‹€. κ·Έ 곡간을 μž„μ˜λ‘œ 1003번으둜 μ •ν–ˆλ‹€. 이 κ³΅κ°„μ˜ 이름(μ‹λ³„μž)을 a라고 μ§€μ •ν•œλ‹€. (λ³€μˆ˜ μ„ μ–Έ κ³Όμ •)
  • 이후 μ‚¬μš©μžκ°€ a에 μ ‘κ·Όν•˜κ³ μž ν•˜λ©΄ μ»΄ν“¨ν„°λŠ” λ©”λͺ¨λ¦¬μ—μ„œ aλΌλŠ” 이름을 가진 μ£Όμ†Œλ₯Ό 검색해 ν•΄λ‹Ή 곡간에 λ‹΄κΈ΄ 데이터λ₯Ό λ°˜ν™˜ν•œλ‹€.

🎈 데이터 할당​

  • λ³€μˆ˜ μ„ μ–Έκ³Ό ν• λ‹Ή
var a; // λ³€μˆ˜a μ„ μ–Έ
a = 'abc'; // λ³€μˆ˜ a에 데이터 ν• λ‹Ή

var a = 'abc'; // μ„ μ–Έκ³Ό 할당을 ν•œ 문자으둜 ν‘œν˜„
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 할당은 μ‹€μ œλ‘œλŠ” ν•΄λ‹Ή μœ„μΉ˜μ— λ¬Έμžμ—΄ abcλ₯Ό 직접 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ³„λ„μ˜ λ©”λͺ¨λ¦¬ 곡간을 λ‹€μ‹œ ν™•λ³΄ν•΄μ„œ abcλ₯Ό μ €μž₯ν•˜κ³ , κ·Έ μ£Όμ†Œλ₯Ό λ³€μˆ˜ μ˜μ—­μ— μ €μž₯ν•˜λŠ” μ‹μœΌλ‘œ 이뀄진닀.
  1. λ³€μˆ˜ μ˜μ—­μ—μ„œ 빈 곡간(1003)을 ν™•λ³΄ν•œλ‹€.
  2. ν™•λ³΄ν•œ κ³΅κ°„μ˜ μ‹λ³„μžλ₯Ό a둜 μ§€μ •ν•œλ‹€.
  3. 데이터 μ˜μ—­μ˜ 빈 곡간(5004)에 λ¬Έμžμ—΄ abcλ₯Ό μ €μž₯ν•œλ‹€.
  4. λ³€μˆ˜ μ˜μ—­μ—μ„œ aλΌλŠ” μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€.(1003)
  5. μ•žμ„œ μ €μž₯ν•œ λ¬Έμžμ—΄μ˜ μ£Όμ†Œ(5004)λ₯Ό 1003의 곡간에 λŒ€μž…ν•œλ‹€.

🐢 λ³€μˆ˜ μ˜μ—­μ— 값을 직접 λŒ€μž…ν•˜μ§€ μ•Šκ³  ꡳ이 번거둭게 ν•œ 단계λ₯Ό κ±°μΉ˜λŠ” μ΄μœ β€‹

  • 데이터 λ³€ν™˜μ„ 자유둭게 ν•  수 있게 함과 λ™μ‹œμ— λ©”λͺ¨λ¦¬λ₯Ό λ”μš± 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 고민의 결과이닀.
  • λ§Œμ•½ 미리 ν™•λ³΄ν•œ 곡간 λ‚΄μ—μ„œλ§Œ 데이터 λ³€ν™˜μ„ ν•  수 μžˆλ‹€λ©΄ λ³€ν™˜ν•œ 데이터λ₯Ό λ‹€μ‹œ μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν™•λ³΄λœ 곡간을 λ³€ν™˜λœ 데이터 크기에 맞게 λŠ˜λ¦¬λŠ” μž‘μ—…μ΄ μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.
  • 효율적으둜 λ¬Έμžμ—΄ λ°μ΄ν„°μ˜ λ³€ν™˜μ„ μ²˜λ¦¬ν•˜λ €λ©΄ λ³€μˆ˜μ™€ 데이터λ₯Ό λ³„λ„μ˜ 곡간에 λ‚˜λˆ„μ–΄ μ €μž₯ν•˜λŠ” 것이 μ΅œμ μ΄λ‹€.
  • λ¬Έμžμ—΄ abc의 λ§ˆμ§€λ§‰μ— defλ₯Ό μΆ”κ°€ν•˜λΌκ³  ν•˜λ©΄ μ»΄ν“¨ν„°λŠ” μ•žμ„œ abcκ°€ μ €μž₯된 곡간에 abcdefλ₯Ό ν• λ‹Ήν•˜λŠ” λŒ€μ‹  abcdefλΌλŠ” λ¬Έμžμ—΄μ„ μƒˆλ‘œ λ§Œλ“€μ–΄ λ³„λ„μ˜ 곡간에 μ €μž₯ν•˜κ³  κ·Έ μ£Όμ†Œλ₯Ό λ³€μˆ˜ 곡간에 μ—°κ²°ν•œλ‹€. μ–΄λ–€ λ³€ν™˜μ„ κ°€ν•˜λ“  상관 없이 무쑰건 μƒˆλ‘œ λ§Œλ“€μ–΄ λ³„λ„μ˜ 곡간에 μ €μž₯ν•œλ‹€.
  • κΈ°μ‘΄ λ°μ΄ν„°λŠ” μžμ‹ μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜κ°€ ν•˜λ‚˜λ„ μ—†κ²Œ 되면 가비지 컬렉터(GC)의 수거 λŒ€μƒμ΄ λœλ‹€.
  • λ˜ν•œ, 예λ₯Ό λ“€μ–΄ 500개의 λ³€μˆ˜λ₯Ό μƒμ„±ν•΄μ„œ λͺ¨λ“  λ³€μˆ˜μ— 숫자 5λ₯Ό ν• λ‹Ήν•˜λŠ” 상황이라면 이 κ²½μš°λŠ” 5λ₯Ό λ³„λ„μ˜ 곡간에 ν•œ 번만 μ €μž₯ν•˜κ³  ν•΄λ‹Ή μ£Όμ†Œλ§Œ μž…λ ₯ν•΄μ€€λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ€‘λ³΅λœ 데이터에 λŒ€ν•œ 처리 효율이 λ†’μ•„μ§€κ²Œ λ˜λŠ” 것이닀.

πŸ“š κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• 데이터​

🎈 λΆˆλ³€κ°’β€‹

  • λ³€μˆ˜μ™€ μƒμˆ˜λ₯Ό κ΅¬λΆ„ν•˜λŠ” μ„±μ§ˆμ€ λ³€κ²½ κ°€λŠ₯성이닀.
  • λ³€μˆ˜μ™€ μƒμˆ˜λ₯Ό ꡬ뢄 μ§“λŠ” λ³€κ²½ κ°€λŠ₯μ„±μ˜ λŒ€μƒμ€ λ³€μˆ˜ μ˜μ—­ λ©”λͺ¨λ¦¬μ΄λ‹€. 즉, ν•œ 번 데이터 할당이 이뀄진 λ³€μˆ˜ 곡간에 λ‹€λ₯Έ 데이터λ₯Ό μž¬ν• λ‹Ήν•  수 μžˆλŠ”μ§€ μ—¬λΆ€κ°€ 관건이 λœλ‹€.
  • 반면 λΆˆλ³€μ„± μ—¬λΆ€λ₯Ό ꡬ뢄할 λ•Œμ˜ λ³€κ²½ κ°€λŠ₯μ„±μ˜ λŒ€μƒμ€ 데이터 μ˜μ—­ λ©”λͺ¨λ¦¬μ΄λ‹€.
  • κΈ°λ³Έν˜• λ°μ΄ν„°λŠ” λͺ¨λ‘ λΆˆλ³€κ°’μ΄λ‹€.
var a = 'abc';
a = a + 'def';

var b = 5;
var c = 5;
b = 7;
  • λ³€μˆ˜ a에 λ¬Έμžμ—΄ abcλ₯Ό ν• λ‹Ήν–ˆλ‹€κ°€ defλ₯Ό μΆ”κ°€ν•˜λ©΄ 기쑴의 abcκ°€ abcdef둜 λ°”λ€ŒλŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ¬Έμžμ—΄ abcdefλ₯Ό λ§Œλ“€μ–΄ κ·Έ μ£Όμ†Œλ₯Ό λ³€μˆ˜ a에 μ €μž₯ν•œλ‹€. 즉, abc와 abcdefλŠ” μ™„μ „νžˆ λ³„κ°œμ˜ 데이터이닀.
  • λ³€μˆ˜ b에 숫자 5λ₯Ό ν• λ‹Ήν•˜λŠ”λ° μ»΄ν“¨ν„°λŠ” 데이터 μ˜μ—­μ—μ„œ 5λ₯Ό μ°Ύκ³  μ—†μœΌλ‹ˆ 데이터 곡간을 ν•˜λ‚˜ λ§Œλ“€μ–΄ μ €μž₯ν•œ λ’€ κ·Έ μ£Όμ†Œλ₯Ό b에 μ €μž₯ν•œλ‹€. λ³€μˆ˜ cλŠ” λ³€μˆ˜ b와 같은 수인 5λ₯Ό ν• λ‹Ήν•˜λ €κ³  ν•œλ‹€. μ»΄ν“¨ν„°λŠ” 데이터 μ˜μ—­μ—μ„œ 5λ₯Ό μ°Ύκ³  이미 5κ°€ μ‘΄μž¬ν•˜λ‹ˆ κ·Έ μ£Όμ†Œλ₯Ό μž¬ν™œμš©ν•œλ‹€.
  • λ³€μˆ˜ bλ₯Ό 7둜 λ°”κΎΈκ³ μž ν•œλ‹€. 그러면 기쑴에 μ €μž₯ν–ˆλ˜ 7을 μ°Ύμ•„μ„œ 있으면 μž¬ν™œμš©ν•˜κ³ , μ—†μœΌλ©΄ μƒˆλ‘œ λ§Œλ“€μ–΄ b에 μ €μž₯ν•œλ‹€.
  • κ²°κ΅­ 5와 7 λͺ¨λ‘ λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•  수 μ—†λ‹€.
  • 이처럼 λ¬Έμžμ—΄ 값도 ν•œ 번 λ§Œλ“  값을 λ°”κΏ€ 수 μ—†κ³ , 숫자 값도 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•  수 μ—†λ‹€. ν•œ 번 λ§Œλ“€μ–΄μ§„ 값은 가비지 μ»¬λ ‰νŒ…μ„ λ‹Ήν•˜μ§€ μ•ŠλŠ” ν•œ μ˜μ›νžˆ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

🎈 가변값​

  • μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ ν• λ‹Ή
var obj1 = {
a: 1,
b: 'bbb',
};
  • λ‹€μŒμ€ μ°Έμ‘°ν˜• 데이터λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 과정이닀.
  1. μ»΄ν“¨ν„°λŠ” μš°μ„  λ³€μˆ˜ μ˜μ—­μ˜ 빈 곡간(1002)을 ν™•λ³΄ν•˜κ³ , κ·Έ μ£Όμ†Œμ˜ 이름을 obj1둜 μ§€μ •ν•œλ‹€.
  2. μž„μ˜μ˜ 데이터 μ €μž₯ 곡간(5001)에 데이터λ₯Ό μ €μž₯ν•˜λ €κ³  λ³΄λ‹ˆ μ—¬λŸ¬ 개의 ν”„λ‘œνΌν‹°λ‘œ 이뀄진 데이터 그룹이닀. 이 κ·Έλ£Ή λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ“€μ„ μ €μž₯ν•˜κΈ° μœ„ν•΄ λ³„λ„μ˜ λ³€μˆ˜ μ˜μ—­μ„ λ§ˆλ ¨ν•˜κ³  κ·Έ μ˜μ—­μ˜ μ£Όμ†Œ(7103 ~ ?)λ₯Ό 5001에 μ €μž₯ν•œλ‹€.
  3. 7103 및 7104에 각각 a와 bλΌλŠ” ν”„λ‘œνΌν‹° 이름을 μ§€μ •ν•œλ‹€.
  4. 데이터 μ˜μ—­μ—μ„œ 숫자 1을 κ²€μƒ‰ν•˜κ³  검색 κ²°κ³Όκ°€ μ—†μœΌλ―€λ‘œ μž„μ˜λ‘œ 5003에 μ €μž₯ν•˜κ³ , 이 μ£Όμ†Œλ₯Ό 7103에 μ €μž₯ν•œλ‹€. λ¬Έμžμ—΄ bbbμ—­μ‹œ 5004에 μ €μž₯ν•˜κ³  이 μ£Όμ†Œλ₯Ό 7104에 μ €μž₯ν•œλ‹€.
  • κΈ°λ³Έν˜• λ°μ΄ν„°μ™€μ˜ μ°¨μ΄λŠ” 객체의 λ³€μˆ˜ μ˜μ—­μ΄ λ³„λ„λ‘œ μ‘΄μž¬ν•œλ‹€λŠ” 점이닀. 객체가 λ³„λ„λ‘œ ν• μ• ν•œ μ˜μ—­μ€ λ³€μˆ˜ μ˜μ—­μΌ 뿐 데이터 μ˜μ—­μ€ 기쑴의 λ©”λͺ¨λ¦¬ 곡간을 κ·ΈλŒ€λ‘œ ν™œμš©ν•˜κ³  μžˆλ‹€. 데이터 μ˜μ—­μ€ λΆˆλ³€κ°’μ΄μ§€λ§Œ λ³€μˆ˜μ—λŠ” λ‹€λ₯Έ 값이 μ–Όλ§ˆλ“ μ§€ λŒ€μž…ν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ°Έμ‘°ν˜• λ°μ΄ν„°λŠ” λΆˆλ³€ ν•˜μ§€ μ•Šλ‹€λΌλŠ” 것이닀.
// μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ ν”„λ‘œνΌν‹° μž¬ν• λ‹Ή
var obj1 = {
a: 1,
b: 'bbb',
};
obj1.a = 2;
  • obj1의 a ν”„λ‘œνΌν‹°μ— 숫자 2λ₯Ό ν• λ‹Ήν•˜λ €κ³  ν•œλ‹€. 데이터 μ˜μ—­μ—μ„œ 숫자 2λ₯Ό κ²€μƒ‰ν•œλ‹€. 검색 κ²°κ³Όκ°€ μ—†μœΌλ―€λ‘œ 빈 곡간인 5005에 μ €μž₯ν•˜κ³  이 μ£Όμ†Œλ₯Ό 7103에 μ €μž₯ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ³€μˆ˜ obj1이 바라보고 μžˆλŠ” μ£Όμ†ŒλŠ” 5001둜 κ·ΈλŒ€λ‘œμ΄λ‹€. 즉, μƒˆλ‘œμš΄ 객체가 λ§Œλ“€μ–΄μ§„ 것이 μ•„λ‹ˆλΌ 기쑴의 객체 λ‚΄λΆ€μ˜ κ°’λ§Œ 바뀐 것이닀.

🎈 λ³€μˆ˜ 볡사 비ꡐ​

  • κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 차이
  • λ³€μˆ˜ 볡사
var a = 10;
var b = a;

var obj1 = {
c: 10,
d: 'ddd',
};
var obj2 = obj1;
  • λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•˜λŠ” 과정은 κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• 데이터 λͺ¨λ‘ 같은 μ£Όμ†Œλ₯Ό λ°”λΌλ³΄κ²Œ λ˜λŠ” μ μ—μ„œ λ™μΌν•˜λ‹€.
  • 볡사 과정은 λ™μΌν•˜μ§€λ§Œ 데이터 ν• λ‹Ή κ³Όμ •μ—μ„œ 이미 차이가 있기 λ•Œλ¬Έμ— λ³€μˆ˜ 볡사 μ΄ν›„μ˜ λ™μž‘μ—λ„ 큰 차이가 λ°œμƒν•œλ‹€.
var a = 10;
var b = a;

var obj1 = {
c: 10,
d: 'ddd',
};
var obj2 = obj1;

b = 15;
obj2.c = 20;
  • κΈ°λ³Έν˜• 데이터λ₯Ό λ³΅μ‚¬ν•œ ν›„ λ³€μˆ˜ b의 값을 λ°”κΏ¨λ”λ‹ˆ 값이 λ‹¬λΌμ§€λŠ” 반면, μ°Έμ‘°ν˜• 데이터λ₯Ό λ³΅μ‚¬ν•œ λ³€μˆ˜ obj2의 ν”„λ‘œνΌν‹°μ˜ 값을 λ°”κΎΈμ—ˆλ”λ‹ˆ 값은 달라지지 μ•Šμ•˜λ‹€.
  • 즉, λ³€μˆ˜ a와 bλŠ” μ„œλ‘œ λ‹€λ₯Έ μ£Όμ†Œλ₯Ό λ°”λΌλ³΄κ²Œ λμœΌλ‚˜, λ³€μˆ˜ obj1κ³Ό obj2λŠ” μ—¬μ „νžˆ 같은 객체λ₯Ό 바라보고 μžˆλŠ” μƒνƒœμ΄λ‹€. 이λ₯Ό μ½”λ“œλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
a !== b;
obj === obj2;
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 사싀 μ–΄λ–€ 데이터 νƒ€μž…μ΄λ“  λ³„μˆ˜μ— ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„œλŠ” μ£Όμ†Ÿκ°’μ„ 볡사해야 ν•˜κΈ° λ•Œλ¬Έμ—, μ—„λ°€νžˆ 따지면 λͺ¨λ“  데이터 νƒ€μž…μ€ μ°Έμ‘°ν˜• 데이터일 μˆ˜λ°–μ— μ—†λ‹€.
  • λ‹€λ§Œ κΈ°λ³Έν˜•μ€ μ£Όμ†Ÿκ°’μ„ λ³΅μ‚¬ν•˜λŠ” 과정이 ν•œ 번만 이뀄지고, μ°Έμ‘°ν˜•μ€ ν•œ 단계λ₯Ό 더 거치게 λœλ‹€λŠ” 차이가 μžˆλ‹€λŠ” 것이닀.
// 객체 자체λ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ
var a = 10;
var b = a;

var obj1 = {
c: 10,
d: 'ddd',
};
var obj2 = obj1;

b = 15;
obj2 = {
c: 20,
d: 'ddd'
};
  • μ΄λ²ˆμ—λŠ” μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήν•¨μœΌλ‘œμ¨ 값을 직접 λ³€κ²½ν–ˆλ‹€. 그러면 λ©”λͺ¨λ¦¬μ˜ 데이터 μ˜μ—­μ— μƒˆλ‘œμš΄ 곡간에 μƒˆ 객체가 μ €μž₯되고 κ·Έ μ£Όμ†Œλ₯Ό λ³€μˆ˜ μ˜μ—­μ˜ obj2 μœ„μΉ˜μ— μ €μž₯ν•  것이닀.
  • 즉, μ°Έμ‘°ν˜• 데이터가 가변값이라고 μ„€λͺ…ν•  λ•Œμ˜ 가변은 μ°Έμ‘°ν˜• 데이터 자체λ₯Ό λ³€κ²½ν•  κ²½μš°κ°€ μ•„λ‹ˆλΌ κ·Έ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  λ•Œλ§Œ μ„±λ¦½ν•œλ‹€.

πŸ“š λΆˆλ³€ 객체​

🎈 λΆˆλ³€ 객체λ₯Ό λ§Œλ“œλŠ” κ°„λ‹¨ν•œ 방법​

  • μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 가변은 데이터 μžμ²΄κ°€ μ•„λ‹Œ λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  λ•Œλ§Œ μ„±λ¦½ν•œλ‹€. 데이터 자체λ₯Ό λ³€κ²½ν•˜κ³ μž ν•˜λ©΄ κΈ°λ³Έ 데이터와 λ§ˆμ°¬κ°€μ§€λ‘œ κΈ°μ‘΄ λ°μ΄ν„°λŠ” λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • κ·Έλ ‡λ‹€λ©΄ λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ–΄ μž¬ν• λ‹Ήν•˜κΈ°λ‘œ κ·œμΉ™μ„ μ •ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“œλŠ” 도ꡬ(immer.js, spread operator, Object.assign)λ₯Ό ν™œμš©ν•œλ‹€λ©΄ 객체 μ—­μ‹œ λΆˆλ³€μ„±μ„ 확보할 수 μžˆλ‹€.
  • κ°’μœΌλ‘œ 전달받은 κ°μ²΄μ—κ²Œ 변경을 κ°€ν•˜λ”λΌλ„ 원본 객체가 λ³€ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” κ²½μš°μ— λΆˆλ³€ 객체가 ν•„μš”ν•˜λ‹€.
var user = {
name: 'Seungmin',
gender: 'male',
};

var changeName = function (user, newName) {
return {
name: newName,
gender: user.gender,
};
};

var uses2 = changeName(user, 'Jung');

if (user !== user2) {
console.log('μœ μ € 정보 λ³€κ²½'); // μœ μ € 정보 λ³€κ²½
}

console.log(user.name, user2.name); // Seungmin Jung
console.log(user === user2); // false
  • changeName ν•¨μˆ˜κ°€ μƒˆλ‘œμš΄ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— user와 user2λŠ” μ„œλ‘œ λ‹€λ₯Έ κ°μ²΄μ΄λ―€λ‘œ μ•ˆμ „ν•˜κ²Œ 비ꡐ할 수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ ν˜„μž¬ gender ν”„λ‘œνΌν‹°λ₯Ό ν•˜λ“œμ½”λ”©μœΌλ‘œ μž…λ ₯ν–ˆλ‹€. λŒ€μƒ 객체의 ν”„λ‘œνΌν‹° κ°œμˆ˜μ— 상관 없이 λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό λ³΅μ‚¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
var copyObject = function (target) {
var result = {};

for(var prop in target) {
result[prop] = target[prop];
}

return result;
};
  • copyObject ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν•©μ˜ν•˜κ³  κ·Έ κ·œμΉ™μ„ μ§€ν‚¨λ‹€λŠ” μ „μ œν•˜μ—μ„œλŠ” user 객체가 곧 λΆˆλ³€ 객체라고 뢈 수 μžˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ‘κ°€ κ·Έ κ·œμΉ™μ„ μ§€ν‚€λ¦¬λΌλŠ” 보μž₯은 μ—†λ‹€.
  • λ˜ν•œ, copyObjectλŠ” 얕은 볡사λ₯Ό μˆ˜ν–‰ν•˜κ³  μžˆλ‹€.
  • 이런 λ§₯λ½μ—μ„œ immutable.js, immer.jsλ“±μ˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 인기λ₯Ό 끌고 μžˆλ‹€.

🎈 얕은 볡사와 κΉŠμ€ 볡사​

  • 얕은 λ³΅μ‚¬λŠ” λ°”λ‘œ μ•„λž˜ λ‹¨κ³„μ˜ κ°’λ§Œ 볡사흔 방법이고, κΉŠμ€ λ³΅μ‚¬λŠ” λ‚΄λΆ€μ˜ λͺ¨λ“  값듀을 ν•˜λ‚˜ν•˜λ‚˜ μ°Ύμ•„μ„œ μ „λΆ€ λ³΅μ‚¬ν•˜λŠ” 방법이닀.
  • 이 말은 μ€‘μ²©λœ κ°μ²΄μ—μ„œ μ°Έμ‘°ν˜• 데이터가 μ €μž₯된 ν”„λ‘œνΌν‹°λ₯Ό 볡사할 λ•Œ κ·Έ μ£Όμ†Ÿκ°’λ§Œ λ³΅μ‚¬ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 그러면 ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ 원본과 사본이 λ™μΌν•œ μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€. 즉, 사본을 λ³€κ²½ν•˜λ©΄ 원본도 λ°”λ€Œκ³ , 원본을 λ³€κ²½ν•˜λ©΄ 사본도 λ³€κ²½λœλ‹€.
var user = {
name: 'Seungmin',
urls: {
portfolio: 'https://github.com/saseungmin',
blog: 'https://haranglog.tistory.com',
},
};

var user2 = copyObject(user);

user2.name = 'Jung';
console.log(user.name === user2.name); // false

user.urls.portfolio = 'https://...';
console.log(user.urls.portfolio === user2.urls.portfolio); // true
  • μœ„ 예제처럼 ν•œ 단계 더 λ“€μ–΄κ°„ urls의 λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ“€μ€ κΈ°μ‘΄ 데이터λ₯Ό κ·ΈλŒ€λ‘œ μ°Έμ‘°ν•˜κ³  μžˆλ‹€. 이런 ν˜„μƒμ΄ λ°œμƒν•˜μ§€ μ•Šκ²Œ ν•˜λ €λ©΄ user.urls ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œλ„ λΆˆλ³€ 객체둜 λ§Œλ“€ ν•„μš”κ°€ μžˆλ‹€.
var user2 = copyObject(user);
user2.urls = copyObject(user.urls);

user.urls.portfolio = 'https://...';
console.log(user.urls.portfolio === user2.urls.portfolio); // false
  • μ–΄λ–€ 객체λ₯Ό 볡사할 λ•Œ 객체 λ‚΄λΆ€μ˜ λͺ¨λ“  값을 λ³΅μ‚¬ν•΄μ„œ μ™„μ „νžˆ μƒˆλ‘œμš΄ 데이터λ₯Ό λ§Œλ“€κ³ μž ν•  λ•Œ, 객체의 ν”„λ‘œνΌν‹° μ€‘μ—μ„œ κ·Έ 값이 κΈ°λ³Έν˜• 데이터일 κ²½μš°μ—λŠ” κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜λ©΄ λ˜μ§€λ§Œ μ°Έμ‘°ν˜• λ°μ΄ν„°λŠ” λ‹€μ‹œ κ·Έ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ“€μ„ 볡사해야 ν•œλ‹€.
  • 이 과정을 μ°Έμ‘°ν˜• 데이터가 μžˆμ„ λ•Œλ§ˆλ‹€ μž¬κ·€μ μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Όλ§Œ λΉ„λ‘œμ†Œ κΉŠμ€ 볡사가 λœλ‹€.
var copyObjectDeep = function (target) {
var result = {};

// null을 뢙인 μ΄μœ λŠ” typeof λͺ…λ Ήμ–΄κ°€ null에 λŒ€ν•΄μ„œλ„ objectλ₯Ό λ°˜ν™˜ν•œλ‹€. (μžλ°”μŠ€ν¬λ¦½νŠΈ 버그)
if(typeof target === 'object' && target !== null) {
for(prop in target) {
result[prop] = copyObjectDeep(target[prop]);
}
} else {
result = target;
}

return result;
};
  • κ°„λ‹¨ν•˜κ²Œ κΉŠμ€ 볡사λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” λ‹€λ₯Έ 방법은 객체λ₯Ό JSON λ¬Έλ²•μœΌλ‘œ ν‘œν˜„λœ λ¬Έμžμ—΄λ‘œ μ „ν™˜ν–ˆλ‹€κ°€ λ‹€μ‹œ JSON 객체둜 λ°”κΎΈλŠ” 것이닀. λ‹€λ§Œ λ©”μ„œλ“œ(ν•¨μˆ˜)λ‹ˆ μˆ¨κ²¨μ§„ ν”„λ‘œνΌν‹°μΈ __proto__λ‚˜ getter/setter λ“±κ³Ό 같이 JSON으둜 λ³€κ²½ν•  수 μ—†λŠ” ν”„λ‘œνΌν‹°λ“€μ€ λͺ¨λ‘ λ¬΄μ‹œν•œλ‹€.
var copyObjectViaJSON = function (target) {
return JSON.parse(JSON.stringify(target));
};

var obj = {
a: 1,
b: {
c: null,
d: [1, 2],
func1: function() {
console.log(3);
},
},
func2: function() {
console.log(4);
},
};

var obj2 = copyObjectViaJSON(obj);

obj2.a = 3;
obj2.b.c = 4;
obj.b.d[1] = 3;

console.log(obj); // { a: 1, b: { c: null, d: [1, 3], func1: f() }, func2: Ζ’() }
console.log(obj2); // { a: 3, b: { c: 4, d: [1, 2] } }

🎈 undefined와 null​

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ—†μŒμ„ λ‚˜νƒ€λ‚΄λŠ” 값이 두 가지 μžˆλŠ”λ° λ°”λ‘œ undefined와 null이닀.
  • undefinedλŠ” μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ 지정할 μˆ˜λ„ μžˆμ§€λ§Œ 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μžλ™μœΌλ‘œ λΆ€μ—¬ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‚¬μš©μžκ°€ μ–΄λ–€ 값을 지정할 것이라고 μ˜ˆμƒλ˜λŠ” μƒν™©μž„μ—λ„ μ‹€μ œλ‘œλŠ” κ·Έλ ‡κ²Œ ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€. λ‹€μŒ μ„Έ κ²½μš°κ°€ 이에 ν•΄λ‹Ήν•œλ‹€.
    1. 값을 λŒ€μž…ν•˜μ§€ μ•Šμ€ λ³€μˆ˜, 즉 데이터 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— μ ‘κ·Όν•  λ•Œ
    2. 객체 λ‚΄λΆ€μ˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ
    3. return 문이 μ—†κ±°λ‚˜ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Ό
// μžλ™μœΌλ‘œ undefinedλ₯Ό λΆ€μ—¬ν•˜λŠ” 경우
var a;
console.log(a); // undefined (1)

var obj = {
a: 1,
};
console.log(obj.b); // (2) μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— μ ‘κ·Ό

var func = function() {};
var c = func(); // (3) return 문이 μ—†κ±°λ‚˜ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Ό
console.log(c); // undefined
  • undefined와 λ°°μ—΄
var arr1 = [];
arr1.length = 3;
console.log(arr1); // [empty x 3]

var arr2 = new Array(3);
console.log(arr2); // [empty x 3]

var arr3 = [undefined, undefined, undefined];
console.log(arr3); // [undefined, undefined, undefined]
  • μœ„ 예제처럼 λΉ„μ–΄μžˆλŠ” μš”μ†Œμ™€ undefinedλ₯Ό ν• λ‹Ήν•œ μš”μ†ŒλŠ” 좜λ ₯ κ²°κ³ΌλΆ€ν„° λ‹€λ₯΄λ‹€.
  • λΉ„μ–΄μžˆλŠ” μš”μ†ŒλŠ” μˆœνšŒμ™€ κ΄€λ ¨λœ λ§Žμ€ λ°°μ—΄ λ©”μ„œλ“œλ“€μ˜ 순회 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.
  • μ‚¬μš©μžκ°€ 직접 undefinedλ₯Ό ν• λ‹Ήν•œ 배열에 λŒ€ν•΄μ„œλŠ” 일반적으둜 μ•Œκ³  μžˆλŠ” λŒ€λ‘œ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•΄μ„œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.
  • κ·ΈλŸ¬λ‚˜ empty둜 λΉ„μ–΄μžˆλŠ” μš”μ†Œμ— λŒ€ν•΄μ„œλŠ” μ–΄λ– ν•œ μ²˜λ¦¬λ„ ν•˜μ§€ μ•Šκ³  κ±΄λ„ˆλ›΄λ‹€.
  • κ·Έλ ‡λ‹€λ©΄ μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ λΆ€μ—¬ν•œ κ²½μš°μ™€ λΉ„μ–΄μžˆλŠ” μš”μ†Œμ— μ ‘κ·Όν•˜λ € ν•  λ•Œ λ°˜ν™˜λ˜λŠ” 두 경우의 undefined의 μ˜λ―ΈλŠ” μ „μžλŠ” κ·Έ 자체둜 값이닀. undefinedκ°€ 비둝 λΉ„μ–΄μžˆμŒμ„ μ˜λ―Έν•˜κΈ°λŠ” ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ΄λ•Œμ˜ ν”„λ‘œνΌν‹°λ‚˜ λ°°μ—΄μ˜ μš”μ†ŒλŠ” 고유의 킀값이 μ‹€μ‘΄ν•˜κ²Œ 되고 순회의 λŒ€μƒμ΄ 될 수 μžˆλ‹€.
  • μ‚¬μš©μžκ°€ 아무것도 ν•˜μ§€ μ•Šμ€ μ±„λ‘œ μ ‘κ·Όν–ˆμ„ λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 ν•˜λŠ” 수 없이 λ°˜ν™˜ν•΄μ£ΌλŠ” undefinedλŠ” ν•΄λ‹Ή ν”„λ‘œνΌν‹° 내지 λ°°μ—΄μ˜ ν‚€κ°’ μžμ²΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ μ˜λ―Έν•œλ‹€.
  • 같은 의미λ₯Ό 가진 nullμ΄λΌλŠ” 값이 λ³„λ„λ‘œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©μžκ°€ 직접 undefinedλ₯Ό 써야 ν•  μ΄μœ κ°€ μ—†λ‹€. 즉, λΉ„μ–΄μžˆμŒμ„ λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λ‚΄κ³  싢을 λ•ŒλŠ” undefinedκ°€ μ•„λ‹Œ nullλ₯Ό μ“°λ©΄ λœλ‹€.
  • μΆ”κ°€λ‘œ null은 μ£Όμ˜ν•  점이 μžˆλŠ”λ° typeof null이 objectλΌλŠ” 점이닀. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 자체 버그이닀. λ”°λΌμ„œ μ–΄λ–€ λ³€μˆ˜μ˜ 값이 null인지 μ—¬λΆ€λ₯Ό νŒλ³„ν•˜κΈ° μœ„ν•΄μ„œλŠ” typeofλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.
// undefined와 null 비ꡐ
var n = null;
console.log(typeof n); // object

console.log(n == undefined); // true
console.log(n == null); // true

console.log(n === undefined); // false
console.log(n === null); // true
  • 동등 μ—°μ‚°μžλ‘œ λΉ„κ΅₯ν•  경우 nullκ³Ό undefinedκ°€ μ„œλ‘œ κ°™λ‹€κ³  νŒλ‹¨ν•œλ‹€. λ”°λΌμ„œ μ–΄λ–€ λ³€μˆ˜κ°€ μ‹€μ œλ‘œ null인지 μ•„λ‹ˆλ©΄ undefinedμΈμ§€λŠ” 동등 μ—°μ‚°μžλ‘œ λΉ„κ΅ν•΄μ„œλŠ” μ•Œ 수 μ—†λ‹€. λ•Œλ¬Έμ— 일치 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Όμ§€ μ •ν™•νžˆ 비ꡐ할 수 μžˆλ‹€.

πŸ“š 정리​

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 데이터 νƒ€μž…μ—λŠ” 크게 κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ΄ μžˆλ‹€. 기본적으둜 κΈ°λ³Έν˜•μ€ λΆˆλ³€κ°’μ΄κ³  μ°Έμ‘°ν˜•μ€ 가변값이닀.
  • λ³€μˆ˜λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 데이터가 λ‹΄κΈΈ 수 μžˆλŠ” 곡간이고, μ‹λ³„μžλŠ” κ·Έ λ³€μˆ˜μ˜ 이름을 λ§ν•œλ‹€.
  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ»΄ν“¨ν„°λŠ” μš°μ„  λ©”λͺ¨λ¦¬μ˜ 빈 곡간에 μ‹λ³„μžλ₯Ό μ €μž₯ν•˜κ³ , κ·Έ κ³΅κ°„μ˜ 값은 undefined둜 ν• λ‹Ήν•œλ‹€. 이후 κ·Έ λ³€μˆ˜μ— κΈ°λ³Έν˜• 데이터λ₯Ό ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ λ³„λ„μ˜ 곡간에 데이터λ₯Ό μ €μž₯ν•˜κ³ , κ·Έ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό λ³€μˆ˜μ˜ κ°’ μ˜μ—­μ— ν• λ‹Ήν•œλ‹€.
  • μ°Έμ‘°ν˜• 데이터λ₯Ό ν• λ‹Ήν•˜κ³ μž ν•  경우 μ»΄ν“¨ν„°λŠ” μ°Έμ‘°ν˜• 데이터 λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ“€μ„ μœ„ν•œ λ³€μˆ˜ μ˜μ—­μ„ λ³„λ„λ‘œ ν™•λ³΄ν•΄μ„œ ν™•λ³΄λœ μ£Όμ†Œλ₯Ό λ³€μˆ˜μ— μ—°κ²°ν•˜κ³ , λ‹€μ‹œ μ•žμ„œ ν™•λ³΄ν•œ λ³€μˆ˜ μ˜μ—­μ— 각 ν”„λ‘œνΌν‹°μ˜ μ‹λ³„μžλ₯Ό μ €μž₯ν•˜κ³ , 각 데이터λ₯Ό λ³„λ„μ˜ 곡간에 μ €μž₯ν•΄μ„œ κ·Έ μ£Όμ†Œλ₯Ό μ‹λ³„μžλ“€κ³Ό λ§€μΉ­μ‹œν‚¨λ‹€.
  • 이처럼 ν• λ‹Ή 과정이 차이가 μƒκΈ°λŠ” μ΄μœ λŠ” μ°Έμ‘°ν˜• 데이터가 μ—¬λŸ¬ 개의 ν”„λ‘œνΌν‹°(λ³€μˆ˜)λ₯Ό λͺ¨μ€ 그룹이기 λ•Œλ¬Έμ΄λ‹€. 그리고 이 차이둜 인해 μ°Έμ‘°ν˜• 데이터λ₯Ό κ°€λ³€κ°’μœΌλ‘œ μ—¬κ²¨μ•Όλ§Œ ν•˜λŠ” 상황이 λ°œμƒν•œλ‹€.
  • μ—†μŒμ„ λ‚˜νƒ€λ‚΄λŠ” 값은 두 가지가 μžˆλŠ”λ°, undefinedλŠ” μ–΄λ–€ λ³€μˆ˜μ— 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우λ₯Ό μ˜λ―Έν•˜κ³  null은 μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ—†μŒμ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ λŒ€μž…ν•œ 값이닀. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 본래의 μ˜λ―Έμ— 따라 μ‚¬μš©μžκ°€ 없을을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ λͺ…μ‹œμ μœΌλ‘œ undefinedλ₯Ό λŒ€μž…ν•˜λŠ” 것은 지양해야 ν•œλ‹€.