๐Ÿฏ ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ๋ฐ์ดํ„ฐ ํƒ€์ž…(ํ•˜)

Solmiiยท2020๋…„ 7์›” 26์ผ
6

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
24/24
post-thumbnail

์–ด... ์ด๊ฑฐ ์™œ์ด๋ ‡๊ฒŒ ์–ด๋ ต์ง€?

๐ŸŒท์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฝ€๊ฐœ๊ธฐ ์‹œ๋ฆฌ์ฆˆ๐ŸŒท


ย ย  4. ๋ณ€์ˆ˜ ๋ณต์‚ฌ ย ย 

๋ณ€์ˆ˜๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ, ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ?
์‚ฌ์‹ค, ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š”๊ฑด (์ƒ)ํŽธ์—์„œ ํ•œ๋ฒˆ ๋‹ค๋ค„๋ดค๋‹ค!

let a = 10;
let b = a;
a = 15;

์ˆœ์„œ๋Œ€๋กœ, a ๋ผ๋Š” ๋ณ€์ˆ˜์— ์ˆซ์ž 10์ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ ,
b ๋ผ๋Š” ๋ณ€์ˆ˜์— a ๋ณ€์ˆ˜์˜ ๊ฐ’(์ˆซ์ž 10์˜ ์ฃผ์†Ÿ๊ฐ’)์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•œ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€์ˆ˜ a์˜ ๊ฐ’์„ 15๋กœ ์žฌํ• ๋‹น ํ•œ๋‹ค.


๊ทธ๋Ÿผ ์ปดํ“จํ„ฐ์—์„  ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค!

ํŒŒ๋ž€์ƒ‰ ๊ธ€์”จ๋ถ€ํ„ฐ ๋ณด๋ฉด, ๋ณ€์ˆ˜ a์™€ b์˜ ๊ฐ’์œผ๋กœ @5003 ์ด ์ค‘๋ณต๋˜์„œ ํ• ๋‹น๋˜์—ˆ๋‹ค๊ฐ€,๋ณ€์ˆ˜ a์˜ ๊ฐ’๋งŒ @5004 ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋ฏ€๋กœ, ์ปดํ“จํ„ฐ๋Š” a = 15 ๋ผ๋Š” ๋ช…๋ น์„ @5003 ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ 15๋กœ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, 15๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ €์žฅํ•œ ๊ฒƒ์ด๋‹ค.

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

let obj1 = { name: 'solmi', age: 26 };
let obj2 = obj1;

@5003 ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” obj1 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

๊ทธ ํ›„์— obj2 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋Š” obj1๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ปดํ“จํ„ฐ๋Š” ์šฐ์„ , obj2๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ (@1003), ๋ณ€์ˆ˜ ์˜์—ญ์—์„œ ์‹๋ณ„์ž๊ฐ€ obj1์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ(@1002) ๊ทธ ๊ฐ’์„ (@5003) @1003์˜ ๊ฐ’์— ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•œ๋‹ค.

console.log( obj1 === obj2 ) // true
์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์‹๋ณ„์ž๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๊ฐ™์€ ์ฃผ์†Ÿ๊ฐ’ @5003 ์„ ๊ฐ’์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ!


์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•˜๋‹ค. ๊ทธ๋Ÿผ obj2์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

obj2.age = 27;

27์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์œผ๋ฏ€๋กœ, ์ƒˆ๋กœ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ถ”๊ฐ€ํ•œ๋‹ค. @5006

obj2์˜ age๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋ฏ€๋กœ, obj2๊ฐ€ ์ฐธ์กฐํ•˜๋Š” @5003 โ†’ @7001 ~ ? ์— ๊ฐ€์„œ ์‹๋ณ„์ž๊ฐ€ age์ธ @7002 ์˜ ๊ฐ’์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ @5006 ์œผ๋กœ ๋ฐ”๊พผ๋‹ค.

์—‡? ๊ทผ๋ฐ ๊ฐ์ฒด @5003 ์˜ ๋ณ€์ˆ˜์˜์—ญ ์˜ ๊ฐ’์€ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ, ์‹ค์ œ ๋ณ€์ˆ˜์˜์—ญ์—์„œ obj1 ๊ณผ obj2 ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Ÿ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค.

์‹ค์ œ ๋ณ€์ˆ˜ ์˜์—ญ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋˜ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐจ์ด๋ฅผ ์•Œ๊ฒ ๋Š”๊ฐ€?!

๋” ํ™•์‹คํžˆ ์•Œ๊ธฐ ์œ„ํ•ด console์„ ์ฐ์–ด๋ณด์ž!

console.log(obj1); // { name: 'solmi', age: 27 }
console.log(obj2); // { name: 'solmi', age: 27 }

์•—!!! obj2์˜ age๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, obj1์˜ age๊นŒ์ง€ ๋ฐ”๋€Œ์–ด๋ฒ„๋ ธ๋‹ค.

์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ๊ฑด ๊ฐ์ฒด @5003 ์˜ ๋ณ€์ˆ˜์˜์—ญ ์ด๊ณ , ์ด๋ฅผ obj1, obj2๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

์ฆ‰, ์‚ฌ๋ณธ์ด ๋ฐ”๋€Œ๋ฉด ์›๋ณธ๋„ ๋ฐ”๋€Œ๊ณ ... ์›๋ณธ์ด ๋ฐ”๋€Œ๋ฉด ์‚ฌ๋ณธ๋„ ๋ฐ”๋€๋‹ค๐Ÿ˜ฑ๐Ÿ˜ฑ๐Ÿ˜ฑ


๋ฌผ๋ก  obj2 = obj1 ์œผ๋กœ ๋ณต์‚ฌํ•˜์ง€ ๋ง๊ณ , ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ž์ฒด๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•œ๋‹ค.

let obj1 = { name: 'solmi', age: 26 };
let obj2 = { name: 'solmi', age: 26 };
obj2.age = 27;

console.log(obj1); // { name: 'solmi', age: 26 }
console.log(obj2); // { name: 'solmi', age: 27 }

์ฆ‰, ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ, ๊ทธ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ์— ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๋ณ€๊ฐ’์ด๋‹ค.

๊ฐ์ฒด ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ๋™์‹œ์— ์›๋ณธ ๊ฐ์ฒด์™€ ๋ณต์‚ฌํ•œ ์‚ฌ๋ณธ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ผ์น˜๋ฉด ์•ˆ๋  ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ๋ณธ ๊ฐ์ฒด์— ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์›๋ณธ ๊ฐ์ฒด์™€ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค๋˜๊ฐ€ ๋“ฑ์˜ ์ƒํ™ฉ์ด ์˜ค๋ฉด, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์žฌํ• ๋‹นํ•˜๋Š” ์‹์œผ๋กœ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋งค๋ฒˆ ์ €๋ ‡๊ฒŒ ์ค‘๋ณต๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ผ์ผ์ด ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋„ˆ๋ฌด๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ๊ฐœ๋˜ฅ๊ฐ™์€ ์ฝ”๋“œ ์™„์„ฑ โ˜…

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด์„œ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ?


ย ย  5. ๋ถˆ๋ณ€ ๊ฐ์ฒด ย ย 

๋ถˆ๋ณ€ ๊ฐ์ฒด(immutable object)๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋””์ž์ธ ํŒจํ„ด ๋“ฑ์—์„œ๋„ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ๋„ React (JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ, state ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ๋•, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ์œ„ํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ~ ํ•˜๋Š” ์„ค๋ช…์„ ๋“ฃ๊ณ  ๋จธ๋ฆฟ์†์ด ??? ์ธ ์ƒํƒœ๋กœ ์•„๋ฌดํŠผ ์‹œํ‚ค๋Š”๋Œ€๋กœ ์ฝ”๋”ฉ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

React์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์ข…ํƒ ๋ฉ˜ํ† ๋‹˜ ๋ธ”๋กœ๊ทธ์— ์žฌ๋ฐŒ๋Š” ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ๊ฐ€์ ธ์™€๋ดค๋‹ค!

์‹ค์ œ๋กœ state ๊ฐ์ฒด์— this.state.name = 'solmi' ๊ฐ™์€ ์‹์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

React.js ์ปดํฌ๋„ŒํŠธ๋Š” state, props์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค(= ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋ ๋•Œ๋งˆ๋‹ค) ๋ฆฌ๋ Œ๋”๋งํ•ด์„œ ํ™”๋ฉด์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š”๋ฐ, state ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ํ”„๋กœํผํ‹ฐ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‚ด๋ถ€์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ์‹ค์ œ state ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Ÿ๊ฐ’์€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ฆ‰, ๋ฆฌ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

React.js ์—์„œ ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•  ๋•Œ push()(์›๋ณธ ๋ฐฐ์—ด์— ์ถ”๊ฐ€) ๊ฐ€ ์•„๋‹Œ concat()(์ด์ „ ๋ฐฐ์—ด๊ณผ ๋Œ€์ƒ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•ด์„œ ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜) ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋„ ์ด์™€ ๊ฐ™๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๊ฑธ๊นŒ? ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค!

  • ๊ฐ์ข… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Lodash, immutable.js, immer.js, baobab.js ๋“ฑ)
    ( Lodash์˜ deepclone ๋ฉ”์„œ๋“œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. )
  • spread operator { ...state }
  • JavaScript์— ๋‚ด์žฅ๋œ Object.assign ๋“ฑ์˜ ๋ฉ”์„œ๋“œ
  • ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜
  • JSON ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์ด์šฉ

ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด์ž!!!!!!!!......๊ธฐ ์ „์—, ๋จผ์ € ์–•์€ ๋ณต์‚ฌ vs ๊นŠ์€ ๋ณต์‚ฌ๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์‚ด์ง ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž!


:: ์–•์€ ๋ณต์‚ฌ vs ๊นŠ์€ ๋ณต์‚ฌ

  • ์–•์€ ๋ณต์‚ฌ(shallow copy) : ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌ
  • ๊นŠ์€ ๋ณต์‚ฌ (deep copy) : ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์ „๋ถ€ ๋ณต์‚ฌ

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ณต์‚ฌ๋ž€, obj2 = obj1 ์ฒ˜๋Ÿผ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹Œ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์žฌํ• ๋‹น ํ•˜๋Š”๊ฒƒ์„ ๋งํ•˜๊ณ ,

๋‹จ๊ณ„๋ž€, ๊ฐ์ฒด์•ˆ์— ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋œ ์ค‘์ฒฉ ๊ฐ์ฒด์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋ด์•ผํ•˜๋Š”๋ฐ, ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ํ™•์ธํ• ๋•Œ๋Š” ํ•œ๋‹จ๊ณ„ ๋” ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

let obj = {
	name: 'solmi', // 1๋‹จ๊ณ„
	age: 26, // 1๋‹จ๊ณ„
	text: [ { 1: "a" }, { 2: "b" }, { 3: "c" } ], // text: [] = 1๋‹จ๊ณ„ // [ {}, {}, {} ] = 2๋‹จ๊ณ„ // { 1: "a" }, { 2: "b" }, { 3: "c" } = 3๋‹จ๊ณ„
	like: {
		food: 'chicken',
		game: 'Battleground'
	} // like: {} = 1๋‹จ๊ณ„ // { food: 'chicken', game: 'Battleground' } = 2๋‹จ๊ณ„
}

1๋‹จ๊ณ„๊ฐ€ ๊ฐ€์žฅ ๋ฐ”๊นฅ ๋‹จ๊ณ„, 3๋‹จ๊ณ„๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋‹จ๊ณ„์ธ ์ด๋Ÿฐ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ!

1๋‹จ๊ณ„์—์„œ ์ปดํ“จํ„ฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

let obj = {
	name: @5002,
	age: @5003,
	text: @5004, // @5004 => ์‹๋ณ„์ž๊ฐ€ text์ธ ๋ฐฐ์—ด(๊ฐ์ฒด)์„ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Ÿ๊ฐ’
	like: @5005 // @5004 => ์‹๋ณ„์ž๊ฐ€ like์ธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Ÿ๊ฐ’
}

์ฆ‰, obj ๋ผ๋Š” ๊ฐ์ฒด๋Š” ์–•์€ ๋ณต์‚ฌ ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” text๋ผ๋Š” ๋ฐฐ์—ด๊ณผ like๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜์–ด์žˆ๋Š” ์ฃผ์†Ÿ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ์ด์ง€ ์‹ค์ œ text ๋ฐฐ์—ด์˜ ํ”„๋กœํผํ‹ฐ์™€ like ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•ด์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

์‹๋ณ„์ž๊ฐ€ text์ธ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•ด์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋‹จ๊ณ„๋กœ ๋“ค์–ด๊ฐ€์„œ ๋ณต์‚ฌํ•ด์™€์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ€๋งŒ๋ณด๋ฉด ์ด ๋ฐฐ์—ด ๋˜ํ•œ ์ค‘์ฒฉ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์˜ { 1: "a" }, { 2: "b" }, { 3: "c" } ๋ผ๋Š” ๊ฐ์ฒด๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ํ”„๋กœํผํ‹ฐ ๋ณต์‚ฌํ•ด์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๋‹จ๊ณ„๊นŒ์ง€ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๊ฒƒ!


๐Ÿคท๐Ÿปโ€โ™€๏ธ ์‹ค์ œ๋กœ obj ๋ฅผ ์–•์€ ๋ณต์‚ฌ ํ•ด์˜จํ›„์— ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

const obj = {
	name: 'solmi',
	age: 26,
	text: [ { 1: "a" }, { 2: "b" }, { 3: "c" } ],
	like: {
		food: 'chicken',
		game: 'Battleground'
	}
}

const shallowCopyObj = { ...obj };

์ „๊ฐœ ์—ฐ์‚ฐ์ž๋กœ obj๋ฅผ ์–•์€ ๋ณต์‚ฌ ํ•ด์„œ, shallowCopyObj ๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ–ˆ๋‹ค.
( ์ „๊ฐœ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์—์„œ ์ด์–ด์ง€๋Š”๋ฐ, ๊ฐ์ฒด์˜ ์–•์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. )

๋ฌธ์ œ์—†์ด ์ž˜ ๋ณต์‚ฌ๋๋‹ค!

์ด์ œ ์‚ฌ๋ณธ์ธ shallowCopyObj ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋ณด์ž!

shallowCopyObj.name = 'coder';
shallowCopyObj.like.food = 'ramen';

๋ณด๋‹ค์‹œํ”ผ 1๋‹จ๊ณ„์— ์žˆ๋Š” name ์€ ์›๋ณธ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ๋ณธ์—์„œ๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ,
2๋‹จ๊ณ„์ธ like.food๋Š” ์‚ฌ๋ณธ์—์„œ๋งŒ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ๋„ ์›๋ณธ๊นŒ์ง€ ๋ฐ”๋€Œ์—ˆ๋‹ค.

2๋‹จ๊ณ„ ๋ถ€ํ„ฐ๋Š” ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ, ๋‹จ์ˆœํžˆ ์›๋ณธ์„ ์ฐธ์กฐ๋งŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ, ์‚ฌ๋ณธ์ด ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ”๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ• ๋•Œ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๐Ÿ˜…

์ฑ…์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š”๋ฐ, ์ด๋Š” ์•„๋ž˜์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ฉด์„œ ์ด์–ด์„œ ๋งํ•˜๋ ค๊ณ  ํ•œ๋‹ค!


:: spread operator

ES6๋ถ€ํ„ฐ ๋“ฑ์žฅํ•œ ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” JavaScript ์ฝ”๋“œ๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ „๊ฐœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž๋ฅผ 0๊ฐœ ์ด์ƒ์˜ ์ธ์ˆ˜ (ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ) ๋˜๋Š” ์š”์†Œ (๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฒฝ์šฐ)๋กœ ํ™•์žฅํ•˜์—ฌ, 0๊ฐœ ์ด์ƒ์˜ ํ‚ค-๊ฐ’์˜ ์Œ์œผ๋กœ ๊ฐ์ฒด๋กœ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MDN์—์„œ๋Š” ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค.
...์•„๋‹ˆ, ์„ค๋ช… ์‹คํ™”๋ƒ....? ์ •๋ง์ด์ง€ ์ฝ์„์ˆ˜๊ฐ€ ์—†๋„ค๐Ÿ™„!!!

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๋ฐฐ์—ด ๋˜๋Š” ๊ฐ์ฒด์˜ ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ’€์–ดํ—ค์น˜๋Š” ๋„ˆ๋‚Œ...?

์ด๊ฑด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค!

const arr = [ 1, 2, 3, 4, 5 ];
console.log( arr ); // [ 1, 2, 3, 4, 5 ]
console.log( ...arr ); // 1 2 3 4 5

200 OK๐Ÿ‘Œ??


์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” ์ฃผ๋กœ ์›๋ณธ์„ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ฉด์„œ ๊ฐ’์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ํ˜น์€ ๋‹ค๋ฅธ ๊ฐ์ฒด, ๋ฐฐ์—ด๊ณผ ๋ณ‘ํ•ฉํ•  ๋•Œ ๋งŽ์ด ์“ฐ์ด๋Š”๋ฐ ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ์–•์€ ๋ณต์‚ฌ ๊ธฐ๋Šฅ๋„ ์ˆ˜ํ–‰ํ•œ๋‹ค!

// ์›๋ณธ์„ ๋ณต์‚ฌํ•œ ํ›„, ๊ฐ’์„ ๋ฐ”๊พธ๊ธฐ
const origin = { name: 'solmi', age: 26 };
const copy = { ...origin, age: 27 };
console.log(copy) //  { name: 'solmi', age: 27 };

// ์›๋ณธ๊ณผ ์‚ฌ๋ณธ์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ
const origin = { name: 'solmi', age: 26 };
const copy = { ...origin, bloodType: 'AB', like: 'JavaScript..?' };
console.log(copy) //  { name: 'solmi', age: 26, bloodType: 'AB', like: 'JavaScript..?' };

๋‹จ, ์›๋ณธ์„ ๋ณต์‚ฌํ•ด์„œ ๊ฐ’์„ ๋ณต์‚ฌํ• ๋•Œ๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— 1๋‹จ๊ณ„์— ์œ„์น˜ํ•œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
์›๋ณธ์€ ์œ ์ง€ํ•˜๋ฉด์„œ ์‚ฌ๋ณธ์˜ ๊นŠ์€ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ „๊ฐœ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์™€์•ผ ํ•œ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™€๏ธ TIP!! ์›๋ณธ๊ณผ ์‚ฌ๋ณธ์„ ๋ณ‘ํ•ฉํ•  ๋•Œ, ์ „๊ฐœ์—ฐ์‚ฐ์ž๋ฅผ ์–ด๋””์— ์“ฐ๋ƒ์— ๋”ฐ๋ผ ์ถœ๋ ฅ๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค!

const origin = [ 'old', 'old2', 'old3' ]
const copy = [ ...origin, 'new..?' ] // [ 'old', 'old2', 'old3', 'new..?' ]
const copy = [ 'new..?', ...origin ] // [ 'new..?', 'old', 'old2', 'old3' ]

origin ์„ ๊ธฐ์กด ๋ฐ์ดํ„ฐ, 'new..?' ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ,
์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ƒ๋‹จ์— ๋ณด์—ฌ์ ธ์•ผ ํ•˜๋Š”์ง€, ํ˜น์€ ๊ฐ€์žฅ ํ•˜๋‹จ์— ๋ณด์—ฌ์ ธ์•ผ ํ•˜๋Š”์ง€ ๋ชฉ์ ์— ๋งž๊ฒŒ ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ์ˆœ์„œ๋กœ ์‰ฝ๊ฒŒ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค!


:: Object.assign()

Object.assign() ๋ฉ”์„œ๋“œ๋Š” ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถœ์ฒ˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋Œ€์ƒ ๊ฐ์ฒด๋กœ ์†์„ฑ์„ ๋ณต์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ถœ์ฒ˜ ๊ฐ์ฒด๋ž€, ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์€ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ๋งํ•˜๊ณ  ๋Œ€์ƒ ๊ฐ์ฒด๋ž€, ์ถœ์ฒ˜ ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ๋ณ‘ํ•ฉ๋˜์„œ ๋ฐ˜ํ™˜๋  ์‚ฌ๋ณธ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

Object.assign(target, sources)

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉฐ, target์ด ๋Œ€์ƒ ๊ฐ์ฒด, sources๊ฐ€ ์ถœ์ฒ˜ ๊ฐ์ฒด์ด๋‹ค! (์ฐธ๊ณ ๋กœ sources๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์ ์–ด๋„ ๋จ)

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const source2 = { d: 9, e: 7 };

console.log(Object.assign(target, source, source2)); // { a: 1, b: 4, c: 5, d: 9, e: 7 }

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์‰ฝ๋‹ค!

๋™์ผํ•œ key๊ฐ€ ์กด์žฌํ•˜๋ฉด, ๋Œ€์ƒ ๊ฐ์ฒด < ์ถœ์ฒ˜ ๊ฐ์ฒด ๋กœ ๋ฎ์–ด์“ฐ์—ฌ์ง€๊ณ , ์ถœ์ฒ˜ ๊ฐ์ฒด ์ค‘์—์„œ๋„ key๊ฐ’์ด ์ค‘๋ณต๋˜๋ฉด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ์ธ์ž์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ์—ฌ์ง„๋‹ค.
( ์œ„ ์˜ˆ์ œ์—์„œ๋„ ๋Œ€์ƒ ๊ฐ์ฒด์˜ b:2๊ฐ€ ์ถœ์ฒ˜ ๊ฐ์ฒด์˜ b:4๋กœ ๋ฎ์–ด์“ฐ์—ฌ์กŒ๋‹ค. )


๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ๋”ฐ๋กœ ์—†๊ณ  Object.assign() ์œผ๋กœ ๊ทธ๋ƒฅ ์›๋ณธ์„ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ• ๋• ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

const source = { a: 1, b: 2 };
const copy = Object.assign({}, source);
console.log(copy); // { a: 1, b: 2 }

๋‹จ, ์ด๋•Œ๋„ ๊ฐ์ฒด์˜ ์–•์€ ๋ณต์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ• ๋•Œ๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!


:: ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

๋‹ค์Œ์€ ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฑ…์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฒ”์šฉ ํ•จ์ˆ˜์ด๋‹ค.

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

์ธ์ž๋กœ ๋“ค์–ด์˜ค๋Š” target์˜ type์ด 'object' ์ด๋ฉด์„œ, null์ด ์•„๋‹ˆ๋ผ๋ฉด (null๋„ object type์ด๊ธฐ ๋•Œ๋ฌธ์—!)

for in ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ target์˜ key ๊ฐ’์„ ์ˆœํšŒํ•˜๋ฉด์„œ copyObjectDee ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ , ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด result ์— ๋ฐ”๋กœ ์ธ์ž๋กœ ๋“ค์–ด์˜จ target์„ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

let originObj = {
	name: 'solmi', // 1๋‹จ๊ณ„
	age: 26, // 1๋‹จ๊ณ„
	text: [ { 1: "a" }, { 2: "b" }, { 3: "c" } ], // text: [] = 1๋‹จ๊ณ„ // [ {}, {}, {} ] = 2๋‹จ๊ณ„ // { 1: "a" }, { 2: "b" }, { 3: "c" } = 3๋‹จ๊ณ„
	like: {
		food: 'chicken',
		game: 'Battleground'
	} // like: {} = 1๋‹จ๊ณ„ // { food: 'chicken', game: 'Battleground' } = 2๋‹จ๊ณ„
}

const copyObj = copyObjectDeep(originObj);

์›๋ณธ ๊ฐ์ฒด๋ฅผ ์ด ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์คฌ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์€ copyObj๋ผ๋Š” ์‚ฌ๋ณธ์— ํ• ๋‹นํ–ˆ๋‹ค.

์›๋ณธ ๊ฐ์ฒด๋Š” ์ค‘์ฒฉ ๊ฐ์ฒด์—์„œ 1๋‹จ๊ณ„, 2๋‹จ๊ณ„ ํ™•์ธํ•  ๋•Œ ๋ดค๋˜ ์˜ˆ์‹œ์ด๋‹ค!

copyObjectDeep ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด, 1๋‹จ๊ณ„์ธ name, age๋Š” ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ (=object) ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— if ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๊ณ  result์— ๋ฐ”๋กœ ๊ฐ๊ฐ์˜ ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ (=object)์ธ text๋ฅผ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„, target์˜ type์ด object์ด๋ฉด์„œ null์ด ์•„๋‹ˆ๋ผ๋Š” ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฏ€๋กœ, copyObjectDeep ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์ด text๋ผ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋Š” key:value ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰๋œ copyObjectDeep ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋˜๋‹ค์‹œ if ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ๋‹ค์‹œ copyObjectDeep ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ฆ‰, ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ 3๋‹จ๊ณ„์ธ "a" ๋ผ๋Š” ๊ฐ’์— ์ ‘๊ทผํ•ด์„œ typeof target === 'object' ๋ผ๋Š” ์กฐ๊ฑด์„ ๋ถˆ๋งŒ์กฑํ• ๋•Œ๊นŒ์ง€ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๊ฐ๊ฐ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ result๋ผ๋Š” ๋ณ€์ˆ˜์— ์žฌํ• ๋‹น = ๋ณต์‚ฌ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์šฐ์™•!! ์ž˜ ๋ณต์‚ฌ๋๋‹ค!!!

๐Ÿง ์—ฅ??? text ๋ถ€๋ถ„์ด ๋ญ”๊ฐ€ ์ด์ƒํ•œ๋””?????

copyObjectDeep ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ
result[prop] = target[prop] result์˜ key ๊ฐ’์œผ๋กœ target์˜ key๊ฐ’์„, result์˜ value๊ฐ’์œผ๋กœ target์˜ value๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ทธ๋ ‡๋‹ค!
๋ฐฐ์—ด๋„ ๊ฒฐ๊ตญ์—” object์ด๋ฏ€๋กœ...

console.log(typeof originObj.text === typeof copyObj.text) // true


๊ทธ๋Ÿผ ์ •๋ง 2๋‹จ๊ณ„, 3๋‹จ๊ณ„ ํ”„๋กœํผํ‹ฐ ๊นŒ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณต์‚ฌํ•ด์˜จ๊ฒŒ ๋งž์„๊นŒ??

copyObj.text[1][2] = "New!!!";
copyObj.like.food = "ramen";

์‚ฌ๋ณธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค!

์˜ค์˜ค์˜ค์˜ค์˜ค~~ ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค!!!!!

๐Ÿคท๐Ÿปโ€โ™€๏ธ ๊นŠ์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ๋ชจ~~~๋“  ์š”์†Œ๋ฅผ ๋‹ค ๋ณต์‚ฌํ•œ๋‹ค?

NO!! ์‚ฌ์‹ค ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋งŒ ๋ณต์‚ฌ๋˜๊ณ , ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ(getter/setter)๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JavaScript ์ตœ์‹  ๋ฌธ๋ฒ•์— ์ถ”๊ฐ€๋œ Object.getOwnPropertyDescription ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ : ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํผํ‹ฐ. "๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ" ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๋”ฑ ๋– ์˜ฌ๋ฆฌ๋Š”! ๊ทธ๊ฒƒ๋“ค์ด ๋ชจ๋‘ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ
  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ : ๊ฐ’์ด ์—†์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ’ ๋Œ€์‹  ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ. ์ฆ‰, ๊ฐ’์„ ํš๋“(get)ํ•˜๊ณ  ์„ค์ •(set)ํ•˜๋Š” ํ•จ์ˆ˜!

:: JSON ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์ด์šฉ

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

์ธ์ž๋กœ ๋ฐ›์€ target์„ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ JavaScript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค!

const copyObj = copyObjectViaJSON(originObj);

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค!

JSON ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” copyObjectViaJSON ํ•จ์ˆ˜์˜ ์›๋ฆฌ๋Š”, ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์–ด์ง€๊ณ , ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ JSON ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค!

  1. ๋‹ค๋ฅธ ๋ฐฉ์‹์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค. (๋Š๋ฆฌ๋‹ค!)
  2. function, _proto_ , getter/setter ๋“ฑ๊ณผ ๊ฐ™์ด JSON์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋“ค์€ ๋ฌด์‹œ๋œ๋‹ค.

ย ย  6. undefined, null ย ย 

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ ๋‚˜์™”๋˜ ์นœ๊ตฌ๋“ค์ด๋‹ค!

undefiend๋Š” ์•„๋งˆ ์ต์ˆ™ํ•  ๊ฒƒ์ด๋‹ค.

์ต์ˆ™ํ•œ ์—๋Ÿฌ.....ใ…Žใ…Ž

:: undefined

undefined ๋Š” JavaScript ์—”์ง„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ผ๋•Œ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•œ๋‹ค.

  • ์„ ์–ธ์€ ๋˜์—ˆ์ง€๋งŒ ๊ฐ’์ด ํ• ๋‹น๋œ ์  ์—†๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋•Œ
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ
  • return์ด ์—†๊ฑฐ๋‚˜ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ (์‹คํ–‰์ด ์•ˆ๋˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜)

์‚ฌ์‹ค....JavaScript ์—๋Š” empty ์ด๋ผ๋Š” ๊ฒƒ๋„ ์žˆ๋‹ค.

์ •ํ™•ํžˆ empty ๋ถ€๋ฅด๋Š”๊ฒŒ ๋งž๋Š”์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. empty ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ƒ๊ธด๋‹ค.

const arr = [];
arr.length = 3;

console.log(arr); // [empty ร— 3]

๊ทผ๋ฐ ์ด๊ฒŒ....๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข€ ์ด์ƒํ•˜๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ ๊ณผ์ •์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ๊ณผ์ •์„ ์ฒœ์ฒœํžˆ ๋”ฐ๋ผ๊ฐ€๋ณด์ž.

์ œ์ผ ๋จผ์ €, ๋ณ€์ˆ˜ ์˜์—ญ์— ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š”๋ฐ, ์‹๋ณ„์ž์˜ ์ด๋ฆ„์€ arr๋กœ ํ•˜๊ณ , ๊ฐ’์€ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค.

์ด ์ƒํƒœ์—์„œ arr์— ์ ‘๊ทผํ•ด์„œ length ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ๊ณต๊ฐ„์„ 3๊ฐœ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทผ๋ฐ ์ด ๊ทธ๋ฆผ๋Œ€๋กœ ๋˜๋ ค๋ฉด,

console.log(arr); // [ undefined, undefined, undefined ]

๊ฐ€ ์ถœ๋ ฅ๋์–ด์•ผ ํ•œ๋‹ค.


ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํŠน์ • index์— ๊ฐ’์„ ์ง€์ •ํ•  ๋•Œ์•ผ ๋น„๋กœ์†Œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋นˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ , ์‹๋ณ„์ž๋ฅผ index๋กœ, ๊ฐ’์„ ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ์ฃผ์†Ÿ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์ด ์‹คํ–‰๋œ๋‹ค.

์ฆ‰, ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š์€ index๋Š” ์•„์ง์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋  ๋ฟ์ด๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ undefined๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, JavaScript ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” undefined๋Š” ์–ด๋”˜๊ฐ€์— ์ €์žฅ๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ, ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ–ˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ์ผ์ข…์˜ ๊ฒฝ๊ณ ์Œ์ธ ๊ฒƒ์ด๋‹ค.

console.log(arr[1]) // undefined

๋‹ค์‹œ ๋งํ•ด ์œ„์˜ arr์˜ 1๋ฒˆ์งธ index์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์ด undefined๋Š”

์‹๋ณ„์ž์˜ ์ด๋ฆ„์ด 1, ํ• ๋‹น๋œ ๊ฐ’์ด undefined์ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ!

์—†๋Š” ์‹๋ณ„์ž์— ์ ‘๊ทผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์–ด์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋ฐ˜ํ™˜๋˜๋Š” undefined์ธ ๊ฒƒ!!!

๐Ÿ’๐Ÿปโ€โ™€๏ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ undefined๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, JavaScript ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ...

๊ทธ๋ ‡๋‹ค. ์šฐ๋ฆฌ๋Š” undefined๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
let a = undefined;

์ด๋ ‡๊ฒŒ ์ง€์ •ํ–ˆ์„๋•Œ์˜ undefined๋Š” ์‹๋ณ„์ž๊ฐ€ a, ๊ฐ’์ด undefined์ธ ์‹ค์กดํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.
๋ฌผ๋ก  ์ฝ”๋“œ์ƒ์œผ๋กœ๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ์ด๊ธฐ์—.......
์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ undefined๋ฅผ ํ• ๋‹นํ•ด๋ฒ„๋ฆฌ๋ฉด, JavaScript๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” undefined๊ฐ€ ๊ฐ’์ด ์—†๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ๋•Œ ์–ด์ฉ”์ˆ˜ ์—†์ด JavaScript ์ž์ฒด์—์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” undefined์ธ์ง€, ์•„๋‹ˆ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ๊ฐ’์ด undefined์ธ ์•„์ด์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

๊ทธ๋ž˜์„œ, ์—†๋Š” ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์„ ๋• undefined ๊ฐ€ ์•„๋‹Œ, null ์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค!!


:: null

๊ฐ’์ด ์—†์Œ, ๋นˆ ๊ฐ’ ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด null์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ผ๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‹ค.

ํ•œ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€, null์€ type์ด object ๋ผ๋Š” ๊ฒƒ!

(๊ทธ๋ž˜์„œ, ์œ„์—์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋ถ€๋ถ„์— target !== null ๋ผ๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.)

์–ด๋–ค ๊ฐ’์ด null ์ธ์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌํ• ๋•Œ๋Š” ์ด๋ ‡๊ฒŒ ์ผ์น˜ ์—ฐ์‚ฐ์ž === !== ๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๊ตํ•ด์ฃผ๋ฉด ๋œ๋‹ค!


์ถœ์ฒ˜ : ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ [์ •์žฌ๋‚จ]


๊ฐœ๋ฐœ ์™•์ดˆ๋ณด ์ฝ”๋ฆฐ์ด์ž…๋‹ˆ๋‹ค!
์ด ๋‚ด์šฉ์€ ๊ฐ์ข… ๊ฐ•์˜&๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ„ ๊ฐœ๋…์ด ํ‹€๋ ธ๊ฑฐ๋‚˜ ๋” ๋ณด์ถฉํ•  ๊ฐœ๋…์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!!

profile
ํ•˜๋ฃจ๋Š” ์น˜์—ดํ•˜๊ฒŒ ์ธ์ƒ์€ ์—ฌ์œ ๋กญ๊ฒŒ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 8์›” 31์ผ

์™€..

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ