[TIL] 220107

Lee SyongΒ·2022λ…„ 1μ›” 7일
0

TIL

λͺ©λ‘ 보기
142/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. 데이터 νƒ€μž…μ˜ μ’…λ₯˜ / λ©”λͺ¨λ¦¬μ™€ 데이터 / μ‹λ³„μžμ™€ λ³€μˆ˜ / λ³€μˆ˜ μ„ μ–Έκ³Ό 데이터 ν• λ‹Ή / κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• 데이터 / λΆˆλ³€κ°’, κ°€λ³€κ°’, λ³€μˆ˜ 볡사 비ꡐ / λΆˆλ³€ 객체 / 얕은 볡사와 κΉŠμ€ 볡사 / JSON을 ν™œμš©ν•œ κ°„λ‹¨ν•œ κΉŠμ€ 볡사 / undefined와 null

πŸ“– ν•™μŠ΅ 자료

  1. μ±… γ€Žμ½”μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈγ€

πŸ“š 배운 것

1. 데이터 νƒ€μž…

1) 데이터 νƒ€μž…μ˜ μ’…λ₯˜

(1) κΈ°λ³Έν˜• 데이터 νƒ€μž…

숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έ(Boolean), null, undefined, 심볼(symbol)

(2) μ°Έμ‘°ν˜• 데이터 νƒ€μž…

객체, λ°°μ—΄, ν•¨μˆ˜, λ‚ μ§œ(Date), μ •κ·œν‘œν˜„μ‹(RegExp), Map, WeakMap, Set, WeakSet

보톡 'κΈ°λ³Έν˜•μ€ 값을 λ³΅μ‚¬ν•˜κ³  μ°Έμ‘°ν˜•μ€ μ£Όμ†Œκ°’μ„ λ³΅μ‚¬ν•œλ‹€'κ³  μ„€λͺ…ν•œλ‹€.
κ·ΈλŸ¬λ‚˜, μ—„λ°€νžˆ λ§ν•˜λ©΄ μ–΄λ–€ 데이터 νƒ€μž…μ΄λ“  λ³€μˆ˜μ— ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„œλŠ” μ£Όμ†Ÿκ°’μ„ 볡사해야 ν•˜κΈ° λ•Œλ¬Έμ— κΈ°λ³Έν˜•λ„ κ²°κ΅­ μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•œλ‹€κ³  ν•  수 μžˆλ‹€.
차이점이라면 κΈ°λ³Έν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’μ„ λ°”λ‘œ λ³΅μ‚¬ν•˜λŠ” 반면, μ°Έμ‘°ν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’λ“€λ‘œ 이루어진 λ¬ΆμŒμ„ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Ÿκ°’μ„ λ³΅μ‚¬ν•œλ‹€λŠ” 것이닀.
이둜 인해 기본적으둜 κΈ°λ³Έν˜•μ€ λΆˆλ³€κ°’, μ°Έμ‘°ν˜•μ€ κ°€λ³€κ°’μ΄λΌλŠ” 차이점이 λ°œμƒν•˜κ²Œ λœλ‹€.


2) 데이터 νƒ€μž…μ— λŒ€ν•œ 배경지식

(1) λ©”λͺ¨λ¦¬μ™€ 데이터

0 λ˜λŠ” 1만 ν‘œν˜„ν•  수 μžˆλŠ” ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬ 쑰각을 λΉ„νŠΈ(bit)라고 ν•˜λ©°, 각 λΉ„νŠΈλŠ” κ³ μœ ν•œ μ‹λ³„μžλ₯Ό 톡해 μœ„μΉ˜λ₯Ό 확인할 수 μžˆλ‹€.
1λ°”μ΄νŠΈ(bite)λŠ” 8개의 λΉ„νŠΈλ‘œ κ΅¬μ„±λ˜μ–΄ 있고, μ‹œμž‘ν•˜λŠ” λΉ„νŠΈμ˜ μ‹λ³„μžλ‘œ μœ„μΉ˜λ₯Ό νŒŒμ•…ν•  수 μžˆλ‹€.
λͺ¨λ“  λ°μ΄ν„°λŠ” λ°”μ΄νŠΈ λ‹¨μœ„μ˜ μ‹λ³„μž, 즉 λ©”λͺ¨λ¦¬ μ£Όμ†Ÿκ°’μ„ 톡해 μ„œλ‘œ κ΅¬λΆ„λ˜κ³  μ—°κ²°ν•  수 μžˆλ‹€.

(2) μ‹λ³„μžμ™€ λ³€μˆ˜

var a = "abc"

λ³€μˆ˜("abc")λž€ λ³€ν•  수 μžˆλŠ” 데이터λ₯Ό λ§ν•œλ‹€.
μ—¬κΈ°μ„œ λ°μ΄ν„°λž€ 숫자, λ¬Έμžμ—΄, 객체, λ°°μ—΄ 등이 λͺ¨λ‘ ν•΄λ‹Ήλœλ‹€.
ν•œνŽΈ, μ‹λ³„μž(a)λž€ μ–΄λ–€ 데이터λ₯Ό μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” 이름, 즉 λ³€μˆ˜λͺ…을 λ§ν•œλ‹€.


3) λ³€μˆ˜ μ„ μ–Έκ³Ό 데이터 ν• λ‹Ή

(1) λ³€μˆ˜ μ„ μ–Έ

var a;

λ©”λͺ¨λ¦¬μ—μ„œ λΉ„μ–΄ μžˆλŠ” 곡간 ν•˜λ‚˜λ₯Ό ν™•λ³΄ν•œλ‹€.
이 κ³΅κ°„μ˜ 이름(μ‹λ³„μž)을 a라고 μ§€μ •ν•œλ‹€.
이 곡간은 μ£Όμ†Œλ₯Ό 가진닀.

(2) 데이터 ν• λ‹Ή

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

var a = "abc"; // λ³€μˆ˜ μ„ μ–Έκ³Ό 데이터 할당을 ν•œ λ¬Έμž₯으둜 ν‘œν˜„

μ•žμ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ λ³€μˆ˜ μ˜μ—­μ„ ν™•λ³΄ν–ˆλ‹€.
λ‹€μŒμœΌλ‘œ ν•΄λ‹Ή λ³€μˆ˜μ— 데이터λ₯Ό ν• λ‹Ήν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ³„λ„μ˜ 곡간 즉, 데이터 μ˜μ—­μ„ 확보해야 ν•œλ‹€.
데이터 μ˜μ—­μ— λ¬Έμžμ—΄ "abc"λ₯Ό μ €μž₯ν•˜κ³  데이터 μ˜μ—­μ˜ μ£Όμ†Œλ₯Ό λ³€μˆ˜ μ˜μ—­μ— μ €μž₯ν•œλ‹€.

즉, λ³€μˆ˜ μ˜μ—­μ— 값을 직접 λŒ€μž…ν•˜μ§€ μ•Šκ³  μ£Όμ†Ÿκ°’μ„ μ €μž₯ν•˜λŠ” ν˜•μ‹μœΌλ‘œ ν•œ 단계λ₯Ό 더 κ±°μΉ˜λŠ” 것이닀.
μœ„μ—μ„œ μ–΄λ–€ 데이터 νƒ€μž…μ΄λ“ (μœ„μ™€ 같은 κΈ°λ³Έν˜• 데이터 νƒ€μž…μ‘°μ°¨λ„) λ³€μˆ˜μ— ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„œλŠ” μ£Όμ†Ÿκ°’μ„ 볡사해야 ν•œλ‹€κ³  λ§ν–ˆλ˜ μ΄μœ μ΄λ‹€.

μ΄λŠ” 데이터 λ³€ν™˜μ„ 자유둭게 ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό λ”μš± 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•¨μ΄λ‹€.
데이터λ₯Ό λ³€ν™˜ν•  λ•Œλ§ˆλ‹€ λ³€μˆ˜ μ˜μ—­μ— 값을 직접 λŒ€μž…ν•œλ‹€λ©΄ λ³€ν™˜ν•œ λ°μ΄ν„°μ˜ 크기에 따라 ν™•λ³΄λœ 곡간을 λŠ˜λ¦¬λŠ” λ“± λΉ„νš¨μœ¨μ μΈ μž‘μ—…μ„ λ°˜λ³΅ν•΄μ•Ό ν•œλ‹€.
이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ κΈ°μ‘΄ λ¬Έμžμ—΄μ— μ–΄λ–€ λ³€ν™˜μ„ κ°€ν•˜λ“  상관 없이 무쑰건 μƒˆλ‘œ λ§Œλ“€μ–΄ λ³„λ„μ˜ 데이터 μ˜μ—­μ— μ €μž₯ν•œ ν›„ κ·Έ 'μ£Όμ†Ÿκ°’'을 λ³€μˆ˜ μ˜μ—­μ— μ €μž₯ν•œλ‹€.
같은 λ§₯락으둜 μ€‘λ³΅λœ 데이터λ₯Ό λ‹€λ£° λ•Œλ„ μ£Όμ†Ÿκ°’μ„ μ €μž₯ν•˜λŠ” ν˜•μ‹μ„ μ·¨ν•˜λ©΄ 훨씬 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.


4) κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• 데이터

μœ„μ—μ„œ κΈ°λ³Έν˜•μ€ λΆˆλ³€κ°’μ΄κ³ , μ°Έμ‘°ν˜•μ€ 가변값이라고 λ§ν–ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ μ—¬κΈ°μ„œ λΆˆλ³€κ°’κ³Ό 가변값은 무엇을 μ˜λ―Έν•˜λŠ” κ²ƒμΌκΉŒ?

(1) λΆˆλ³€κ°’

μƒμˆ˜ vs λΆˆλ³€κ°’

λ³€μˆ˜μ™€ μƒμˆ˜λ₯Ό ꡬ뢄 μ§“λŠ” λ³€κ²½ κ°€λŠ₯μ„±μ˜ λŒ€μƒμ€ λ³€μˆ˜ μ˜μ—­ λ©”λͺ¨λ¦¬μ΄λ‹€.
ν•œλ²ˆ 데이터 할당이 이뀄진 λ³€μˆ˜ μ˜μ—­μ— λ‹€λ₯Έ 데이터λ₯Ό μž¬ν• λ‹Ήν•  수 μžˆλŠ”μ§€μ˜ μ—¬λΆ€κ°€ 관건이닀.
λ°˜λ©΄μ—, λΆˆλ³€μ„± μ—¬λΆ€λ₯Ό ꡬ뢄할 λ•Œμ˜ λ³€κ²½ κ°€λŠ₯μ„±μ˜ λŒ€μƒμ€ 데이터 μ˜μ—­ λ©”λͺ¨λ¦¬μ΄λ‹€.

κΈ°λ³Έν˜• 데이터 νƒ€μž…

λ³€μˆ˜ μ˜μ—­μ— 데이터λ₯Ό ν• λ‹Ήν•œ ν›„ λ‹€λ₯Έ 데이터λ₯Ό μž¬ν• λ‹Ήν•˜λ €κ³  ν•œλ‹€.
μ΄λ•Œ 기쑴의 데이터λ₯Ό λ‹€λ₯Έ λ°μ΄ν„°λ‘œ λ°”κΏ€ 수 μ—†λ‹€.
λ°”κΎΈκ³ μž ν•˜λŠ” 데이터가 데이터 μ˜μ—­ μ–΄λ”˜κ°€μ— μžˆλ‹€λ©΄ 이λ₯Ό μ°Ύμ•„μ„œ κ·Έ μ£Όμ†Ÿκ°’μ„ λ³€μˆ˜ μ˜μ—­μ— μƒˆλ‘­κ²Œ ν• λ‹Ήν•˜κ³ , μ—†λ‹€λ©΄ 데이터 μ˜μ—­μ— ν•΄λ‹Ή 데이터λ₯Ό μƒˆλ‘œ λ§Œλ“  ν›„ κ·Έ μ£Όμ†Ÿκ°’μ„ λ³€μˆ˜ μ˜μ—­μ— μƒˆλ‘­κ²Œ ν• λ‹Ήν•œλ‹€.

λ”°λΌμ„œ, 이 κ²½μš°μ— λ³€μˆ˜ 곡간에 λ‹€λ₯Έ 데이터λ₯Ό μž¬ν• λ‹Ήν•  수 있기 λ•Œλ¬Έμ— μƒμˆ˜κ°€ μ•„λ‹Œ 'λ³€μˆ˜'μ΄μ§€λ§Œ, 이λ₯Ό μœ„ν•΄ λ³€μˆ˜ μ˜μ—­μ— ν• λ‹Ήλœ 데이터 μ˜μ—­μ˜ 값을 λ³€κ²½ν•  μˆ˜λŠ” μ—†κ³  μƒˆλ‘œ λ§Œλ“€μ–΄ μž¬ν• λ‹Ήν•΄μ•Ό ν•˜λ―€λ‘œ ν•΄λ‹Ή 데이터 νƒ€μž…μ€ 'λΆˆλ³€κ°’'이라고 ν•  수 μžˆλ‹€.

κΈ°λ³Έν˜• 데이터 νƒ€μž…μ€ 가비지 μ»¬λ ‰νŒ… λ‹Ήν•˜μ§€ μ•ŠλŠ” ν•œ μ˜μ›νžˆ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
μ–΄λ–€ 데이터든 μžμ‹ μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜κ°€ ν•˜λ‚˜λ„ μ—†κ²Œ 되면(μ°Έμ‘° μΉ΄μš΄νŠΈκ°€ 0이 되면) 가비지 μ»¬λ ‰ν„°μ˜ 수거 λŒ€μƒμ΄ λœλ‹€.
수거된 λ©”λͺ¨λ¦¬λŠ” λ‹€μ‹œ μƒˆλ‘œμš΄ 값을 ν• λ‹Ήν•  수 μžˆλŠ” 빈 곡간이 λœλ‹€.

(2) κ°€λ³€κ°’

μ°Έμ‘°ν˜• 데이터 νƒ€μž…

μ°Έμ‘°ν˜• 데이터 νƒ€μž…μ€ '객체의 λ³€μˆ˜(ν”„λ‘œνΌν‹°) μ˜μ—­'을 λ³„λ„λ‘œ 가지고 μžˆλ‹€.
κΈ°λ³Έν˜•μ€ λ³€μˆ˜ μ˜μ—­κ³Ό 데이터 μ˜μ—­μ„ κ°€μ§ˆ λΏμ΄μ§€λ§Œ, μ°Έμ‘°ν˜•μ€ 여기에 객체의 λ³€μˆ˜ μ˜μ—­μ„ μΆ”κ°€λ‘œ 가지고 μžˆλ‹€.

μ•žμ„œ μ°Έμ‘°ν˜•μ΄ 가변값이라고 ν•œ 것은, μ—¬κΈ°μ„œ 데이터 μ˜μ—­μ— μ €μž₯된 값은 κΈ°λ³Έν˜• 데이터 νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λͺ¨λ‘ λΆˆλ³€κ°’μ΄μ§€λ§Œ, 객체의 λ³€μˆ˜ μ˜μ—­μ—λŠ” λ‹€λ₯Έ 데이터λ₯Ό μ–Όλ§ˆλ“ μ§€ μž¬ν• λ‹Ήν•  수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.

쀑첩 객체

var obj = {
  x: 3,
  arr: [3, 4, 5],
};

μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ λ³€μˆ˜(ν”„λ‘œνΌν‹°)에 λ‹€μ‹œ μ°Έμ‘°ν˜• 데이터λ₯Ό ν• λ‹Ήν•˜λŠ” 것을 λ§ν•œλ‹€.

(3) λ³€μˆ˜ 볡사 비ꡐ

μ•žμ„œ μ–΄λ–€ 데이터 νƒ€μž…μ΄λ“  λ³€μˆ˜μ— ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„œλŠ” μ£Όμ†Ÿκ°’μ„ 볡사해야 ν•˜κΈ° λ•Œλ¬Έμ— κΈ°λ³Έν˜•λ„ κ²°κ΅­ μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•œλ‹€κ³  ν•  수 μžˆλ‹€κ³  ν–ˆλ‹€.
λ”°λΌμ„œ, λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•˜λŠ” 과정은 κΈ°λ³Έν˜• 데이터와 μ°Έμ‘°ν˜• 데이터 λͺ¨λ‘ 같은 μ£Όμ†Œ(데이터 μ˜μ—­μ˜ μ£Όμ†Ÿκ°’)λ₯Ό λ°”λΌλ³΄κ²Œ λœλ‹€λŠ” μ μ—μ„œλŠ” λ™μΌν•˜λ‹€.

κ·ΈλŸ¬λ‚˜, κΈ°λ³Έν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’(데이터 μ˜μ—­μ˜ μ£Όμ†Ÿκ°’)을 λ°”λ‘œ λ³΅μ‚¬ν•˜λŠ” 반면, μ°Έμ‘°ν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’λ“€β€•κ°μ²΄μ˜ λ³€μˆ˜ μ˜μ—­μ˜ μ£Όμ†Ÿκ°’λ“€β€•λ‘œ 이루어진 λ¬ΆμŒμ„ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Ÿκ°’(데이터 μ˜μ—­μ˜ μ£Όμ†Ÿκ°’)을 λ³΅μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— λ³€μˆ˜ 볡사 μ΄ν›„μ˜ λ™μž‘μ—μ„œ 큰 차이가 λ°œμƒν•œλ‹€.

객체의 ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ

var a = 10;
var b = a;
var obj1 = { c: 10, d: "ddd" };
var obj2 = obj1;

b = 15;
obj2.c = 20;

console.log(a !== b); // true
console.log(obj1 === obj2); // true

이처럼 λ³€μˆ˜ 볡사 이후 값을 λ³€κ²½ν–ˆμ„ λ•Œ κΈ°λ³Έν˜•μ˜ 경우 볡사 μ „ν›„μ˜ λ³€μˆ˜μ˜ 값이 λ‹¬λΌμ§€μ§€λ§Œ μ°Έμ‘°ν˜•μ˜ 경우 κ·Έ 값이 달라지지 μ•ŠλŠ”λ‹€.

κΈ°λ³Έν˜•μ€ 값이 λ‹΄κΈ΄ μ£Όμ†Ÿκ°’μ„ λ°”λ‘œ λ³΅μ‚¬ν–ˆκΈ° λ•Œλ¬Έμ— λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•œ ν›„ 값이 λ³€κ²½λ˜λ©΄ λ³΅μ‚¬ν•œ λ³€μˆ˜ μ˜μ—­μ—λŠ” μƒˆλ‘œμš΄ 데이터λ₯Ό κ°€μ§€λŠ” 데이터 μ˜μ—­μ˜ μ£Όμ†Ÿκ°’μ΄ ν• λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— 볡사 μ „ν›„μ˜ λ³€μˆ˜μ˜ 값이 λ‹¬λΌμ§€κ²Œ λœλ‹€.

κ·ΈλŸ¬λ‚˜, μ°Έμ‘°ν˜•μ€ λ³€μˆ˜ 볡사 이후 값이 변경됐어도 μ΄λ•Œ λ³€κ²½λœ κ°’(즉, μƒˆλ‘œμš΄ 데이터λ₯Ό κ°€μ§€λŠ” 데이터 μ˜μ—­μ˜ μ£Όμ†Ÿκ°’)은 λ³΅μ‚¬ν•œ λ³€μˆ˜ μ˜μ—­ κ·Έ μžμ²΄κ°€ μ•„λ‹ˆλΌ 객체의 λ³€μˆ˜(ν”„λ‘œνΌν‹°) μ˜μ—­μ— ν• λ‹Ήλ˜κΈ° λ•Œλ¬Έμ— λ³΅μ‚¬ν•œ λ³€μˆ˜ μ˜μ—­μ€ 이전과 λ‹€λ¦„μ—†λŠ” μ£Όμ†Œλ₯Ό 가지고 있게 λœλ‹€.
즉, μ—¬μ „νžˆ 볡사 μ „ν›„μ˜ λ³€μˆ˜ λͺ¨λ‘ 같은 μ£Όμ†Ÿκ°’μ„ 가지고 있고, κ·Έμ € κ·Έ μ£Όμ†Ÿκ°’μ„ 이루고 μžˆλŠ” 객체의 λ³€μˆ˜(ν”„λ‘œνΌν‹°) μ˜μ—­μ΄ λ³€ν•œ 것이기에 볡사 μ „ν›„μ˜ λ³€μˆ˜ λͺ¨λ‘ 같은 κ°’μœΌλ‘œ λ³€ν•˜κ²Œ 되고 κ²°κ΅­ λ‘˜μ˜ 값에 차이가 μƒκΈ°μ§€λŠ” μ•ŠλŠ” 것이닀.

객체 자체λ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ

단, μ°Έμ‘°ν˜•μ˜ κ²½μš°μ—λ„ κ·Έμ € 객체의 ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ•„μ˜ˆ λ³€μˆ˜μ— μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήν•¨μœΌλ‘œμ¨ κ·Έ 값을 직접 λ³€κ²½ν•œλ‹€λ©΄ λΆˆλ³€κ°’μ΄ 될 μˆ˜λ„ μžˆλ‹€.
즉, μ°Έμ‘°ν˜• 데이터λ₯Ό κ°€λ¦¬μΌœ 가변값이라고 μ„€λͺ…ν•  λ•Œμ˜ 'κ°€λ³€'은 μ°Έμ‘°ν˜• 데이터 자체λ₯Ό λ³€κ²½ν•  κ²½μš°κ°€ μ•„λ‹ˆλΌ κ·Έ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  λ•Œλ§Œ μ„±λ¦½ν•˜λŠ” 것이닀.


5) λΆˆλ³€ 객체

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

μ°Έμ‘°ν˜• 데이터도 데이터 자체λ₯Ό λ³€κ²½ν•˜κ³ μž ν•˜λ©΄(μƒˆλ‘œμš΄ 데이터λ₯Ό ν• λ‹Ήν•˜κ³ μž ν•˜λ©΄) κΈ°λ³Έν˜• 데이터와 λ§ˆμ°¬κ°€μ§€λ‘œ 기쑴의 λ°μ΄ν„°λŠ” λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
κ·ΈλŸ¬λ―€λ‘œ λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ–΄ μž¬ν• λ‹Ήν•˜κΈ°λ‘œ κ·œμΉ™μ„ μ •ν•˜κ±°λ‚˜ μžλ™μœΌλ‘œ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“œλŠ” 도ꡬλ₯Ό ν™œμš©ν•œλ‹€λ©΄ 객체 μ—­μ‹œ λΆˆλ³€μ„±μ„ 확보할 수 μžˆλ‹€.

문제

var user = { // μ°Έμ‘°ν˜• 데이터(객체)
  name: "syong",
  gender: "female",
};

var changeName = (user, newName) => {
  var newUser = user; // λ³€μˆ˜ 볡사
  newUser.name = newUser; // κ°’ λ³€κ²½
  return newUser;
};

var user2 = changeName(user, "syongsyong");

if (user !== user2) {
  console.log("user 정보가 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
}

console.log(user.name, user.name === user2.name); // syongsyong, true
console.log(user === user2); // true

λΆˆλ³€ 객체가 ν•„μš”ν•œ λŒ€ν‘œμ μΈ μ‚¬λ‘€λ‘œλŠ” user μ •λ³΄μ˜ λ³€κ²½ μ—¬λΆ€λ₯Ό 감지해 μ•ˆλ‚΄ν•˜κ³ μž ν•  λ•Œλ₯Ό λ“€ 수 μžˆλ‹€.
이 경우 user 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 객체가 λ³€κ²½λ˜λ©΄ 이λ₯Ό 감지해 μ•ˆλ‚΄ν•΄μ•Ό ν•˜λŠ”λ° 객체의 κ°€λ³€μ„±μœΌλ‘œ 인해 user 객체λ₯Ό λ³΅μ‚¬ν•œ 객체의 ν”„λ‘œνΌν‹°κ°€ 변해도 기쑴의 user κ°μ²΄κΉŒμ§€ ν•¨κ»˜ 변해버렀 κ·Έ λ³€κ²½ μ—¬λΆ€λ₯Ό 감지할 μˆ˜κ°€ μ—†μ–΄ λ¬Έμ œκ°€ λœλ‹€.

ν•΄κ²° 방법 1: μ•„μ˜ˆ μƒˆλ‘œμš΄ 객체 λ§Œλ“€κΈ°

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

var user2 = changeName(user, "syongsyong");

μ΄λ•ŒκΈ°μ‘΄μ˜ user 객체λ₯Ό λΆˆλ³€ 객체둜 λ§Œλ“€κΈ° μœ„ν•΄ 객체의 λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  λ•Œ λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ§Œμ„ μˆ˜μ •ν•˜λŠ” 게 μ•„λ‹ˆλΌ μ•„μ˜ˆ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
λ‹€λ§Œ, μ΄λŠ” λ³€κ²½ν•  ν•„μš”κ°€ μ—†λŠ” κΈ°μ‘΄ 객체의 ν”„λ‘œνΌν‹°(gender)κΉŒμ§€ ν•˜λ“œμ½”λ”©μœΌλ‘œ μž…λ ₯ν•΄ λΉ„νš¨μœ¨μ μ΄λ‹€.

ν•΄κ²° 방법 2: 얕은 볡사

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

var user2 = copyObject(user);
user2.name = "syongsyong";

ν•˜λ“œμ½”λ”© 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 얕은 볡사λ₯Ό ν•  수 μžˆλ‹€.
κ·ΈλŸ¬λ‚˜ μ΄λŠ” 말 κ·ΈλŒ€λ‘œ 얕은 λ³΅μ‚¬λΌλŠ” μ μ—μ„œ ν•œκ³„λ₯Ό 가진닀.

(2) 얕은 볡사와 κΉŠμ€ 볡사

얕은 λ³΅μ‚¬λŠ” λ°”λ‘œ μ•„λž˜ λ‹¨κ³„μ˜ κ°’λ§Œ λ³΅μ‚¬ν•˜λŠ” 방법이고, κΉŠμ€ λ³΅μ‚¬λŠ” λ‚΄λΆ€μ˜ λͺ¨λ“  값듀을 ν•˜λ‚˜ν•˜λ‚˜ μ°Ύμ•„μ„œ μ „λΆ€ λ³΅μ‚¬ν•˜λŠ” 방법이닀.

얕은 λ³΅μ‚¬μ˜ 문제점 (쀑첩 객체의 경우)

var user = {
  name: "syong",
  urls: {
    portfolio: "http://github.com/abc",
    blog: "http://blog.com",
    facebook: "http://facebook.com/abc",
  };
};

var user2 = copyObject(user);

user2.name = "syongsyong";
console.log(user.name === user2.name); // false

user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); // true

이처럼 user 객체에 직접 μ†ν•œ ν”„λ‘œνΌν‹°μΈ name에 λŒ€ν•΄μ„œλŠ” λ³΅μ‚¬ν•΄μ„œ μ™„μ „νžˆ μƒˆλ‘œμš΄ 데이터가 λ§Œλ“€μ–΄μ§„ 반면, ν•œ 단계 더 λ“€μ–΄κ°€μ„œ 객체의 또 λ‹€λ₯Έ ν”„λ‘œνΌν‹°μΈ urls의 'λ‚΄λΆ€ ν”„λ‘œνΌν‹°'듀은 κΈ°μ‘΄ 데이터λ₯Ό κ·ΈλŒ€λ‘œ μ°Έμ‘°ν•˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.

쀑접 객체에 λŒ€ν•œ κΉŠμ€ 볡사

var user2 = copyObject(user);
var user2.urls = copyObject(user.urls); // μΆ”κ°€ ❗

user2.name = "syongsyong";
console.log(user.name === user2.name); // false

user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); // false

쀑첩 객체λ₯Ό μ™„λ²½ν•œ λΆˆλ³€ 객체둜 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” κΉŠμ€ 볡사λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.
즉, 쀑첩 객체의 ν”„λ‘œνΌν‹° μ€‘μ—μ„œ κ·Έ 값이 μ°Έμ‘°ν˜• 데이터일 경우 λ‹€μ‹œ κ·Έ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ“€κΉŒμ§€ 볡사해야 ν•œλ‹€.

객체의 κΉŠμ€ 볡사λ₯Ό μˆ˜ν–‰ν•˜λŠ” λ²”μš© ν•¨μˆ˜

var copyObjectDeep = (target) => {
  var result = {};
  if (typeof target === "object" && target !== null) {
    for (var prop in target) {
      result[prop] = copyObjectDeep(target[prop]);
    }
  } else {
    result = target;
  }
  return result;
};

var user2 = copyObjectDeep(user);

JSON을 ν™œμš©ν•œ κ°„λ‹¨ν•œ κΉŠμ€ 볡사

var copyObjectViaJSON = (target) => JSON.parse(JSON.stringify(target));

var user2 = copyObjectViaJSON(user);

JSON 문법을 μ΄μš©ν•΄ κ°„λ‹¨ν•˜κ²Œ κΉŠμ€ 볡사λ₯Ό ν•  μˆ˜λ„ μžˆλ‹€.
λ‹€λ§Œ, μ΄λŠ” __proto__λ‚˜ getter/setter λ“±κ³Ό 같이 JSON으둜 λ³€κ²½ν•  수 μ—†λŠ” ν”„λ‘œνΌν‹°λ“€μ€ 볡사할 수 μ—†λ‹€λŠ” ν•œκ³„λ₯Ό 가진닀.


6) undefined와 null

(1) undefined

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μžλ™μœΌλ‘œ undefinedλ₯Ό λΆ€μ—¬ν•˜λŠ” 경우

  • 값을 λŒ€μž…ν•˜μ§€ μ•Šμ€ λ³€μˆ˜, 즉 데이터 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— μ ‘κ·Όν•  λ•Œ
  • 객체 λ‚΄λΆ€μ˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ
  • return 문이 μ—†κ±°λ‚˜ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Ό

값을 λŒ€μž…ν•˜μ§€ μ•Šμ€ λ°°μ—΄

λ°°μ—΄μ—μ„œ λΉ„μ–΄μžˆλŠ” μš”μ†Œμ™€ 'undefined'라도 ν• λ‹Ήν•œ μš”μ†ŒλŠ” 좜λ ₯ κ²°κ³Όκ°€ λ‹€λ₯΄λ‹€.
λΉ„μ–΄μžˆλŠ” μš”μ†ŒλŠ” forEach, map, filter, reduce λ“± μˆœνšŒμ™€ κ΄€λ ¨λœ λ§Žμ€ λ°°μ—΄ λ©”μ„œλ“œλ“€μ˜ 순회 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.
값이 μ§€μ •λ˜μ§€ μ•Šμ€ μΈλ±μŠ€λŠ” 아직 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— μ§€λ‚˜μ§€ μ•Šκ³ , μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œλŠ” λ‹Ήμ—°νžˆ μˆœνšŒν•  수 μ—†λŠ” 것이닀.

(2) null

이처럼 κ°’μœΌλ‘œμ¨ μ–΄λ”˜κ°€μ— ν• λ‹Ήλœ undefinedλŠ” μ‹€μ‘΄ν•˜λŠ” 데이터인 반면, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ°˜ν™˜ν•΄μ£ΌλŠ” undefinedλŠ” 문자 κ·ΈλŒ€λ‘œ 값이 μ—†μŒμ„ λ‚˜νƒ€λ‚Έλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
ν˜Όλž€μ„ ν”Όν•˜κΈ° μœ„ν•΄μ„œλŠ” undefinedλŠ” ν›„μžμ˜ κ²½μš°μ—λ§Œ 쓰이도둝 ν•˜κ³ , 값이 μ—†μŒμ„ λ‚˜νƒ€λ‚΄κ³ μž ν•  λ•ŒλŠ” undefined λŒ€μ‹  null을 μ‚¬μš©ν•˜λ„λ‘ ν•œλ‹€.

λ‹€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 자체 λ²„κ·Έλ‘œ 인해 typeof null은 object이기 λ•Œλ¬Έμ— μ–΄λ–€ λ³€μˆ˜μ˜ 값이 null인지 μ—¬λΆ€λ₯Ό νŒλ³„ν•˜κΈ° μœ„ν•΄μ„œλŠ” 일치 μ—°μ‚°μž(===)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 동등 μ—°μ‚°μž(==) x

var n === null;

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

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

✨ 내일 ν•  것

  1. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ / this
profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€