copying objects in javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki

Copying Objects in JavaScript

์›๋ฌธ: Copying Objects in JavaScript

๊ฐ์ฒด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๋ธ”๋ก์ด๋‹ค. ๊ฐ์ฒด๋Š” ์†์„ฑ์˜ ์ง‘ํ•ฉ์ด๋ฉฐ ์†์„ฑ์€ ํ‚ค(๋˜๋Š” ์ด๋ฆ„)์™€ ๊ฐ’์˜ ์—ฐ๊ฒฐ์ด๋‹ค. Javascript์— ์žˆ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ƒ๋‹จ์— ์žˆ๋Š” Object์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด๋‹ค.

์†Œ๊ฐœ

์•„์‹œ๋‹ค์‹œํ”ผ, ํ• ๋‹น ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋งŒ์„ ํ• ๋‹นํ•œ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

let obj = {
  a: 1,
  b: 2,
};
let copy = obj;

obj.a = 5;
console.log(copy.a);
// Result 
// a = 5;

obj ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™”๋œ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. copy ๋ณ€์ˆ˜๋Š” obj๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ , ๊ทธ ๊ฒƒ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ธฐ๋ณธ์ ์œผ๋กœ { a: 1, b: 2 } object๋Š” ๋‘๊ฐ€์ง€ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด (obj, copy) ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. obj ๋ณ€์ˆ˜๋‚˜ copy ๋ณ€์ˆ˜์—๊ฒŒ ๊ฐ’์„ ํ• ๋‹น ํ•˜๋ฉด { a: 1, b: 2 } ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋‹ค.

Immutability(๋ถˆ๋ณ€์„ฑ)์ด๋ž€ ๋‹จ์–ด๊ฐ€ ์š”์ƒˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ฑฐํ•˜๋ฉฐ ์›๋ž˜์˜ ๊ฐ์ฒด๊ฐ€ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ•ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ˆœํ•œ ๊ฐ์ฒด ๋ณต์‚ฌ ๋ฐฉ๋ฒ•

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ์›๋ž˜์˜ ๊ฐ์ฒด๋ฅผ ์ˆœํ™˜์‹œ์ผœ ๊ฐ๊ฐ์˜ ์†์„ฑ์„ ์ฐจ๋ก€๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

function copy(mainObj) {
  let objCopy = {}; // objCopy will store a copy of the mainObj
  let key;

  for (key in mainObj) {
    objCopy[key] = mainObj[key]; // copies each property to the objCopy object
  }
  return objCopy;
}

const mainObj = {
  a: 2,
  b: 5,
  c: {
    x: 7,
    y: 4,
  },
}

console.log(copy(mainObj));

๋‚ด์ œ๋œ ๋ฌธ์ œ์ 

  1. ์˜๋„ํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, mainObj ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ์™€ ์ƒˆ๋กœ์šด objCopy์˜ Object.prototype ๋ฉ”์„œ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ์›๋ž˜ ์˜๋„๋Š” ๊ฐ์ฒด์˜ ์ •ํ™•ํ•œ ์‚ฌ๋ณธ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค.
  2. ์†์„ฑ ์„œ์ˆ ์ž(Property descriptors)๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ’์ด false๋กœ ์„ค์ •๋œ "writable" ์„œ์ˆ ์ž๋Š” objCopy ๊ฐ์ฒด์—์„œ true๊ฐ€ ๋œ๋‹ค.

    ์†์„ฑ ์„œ์ˆ ์ž(Property descriptors) ์ฐธ๊ณ : Object.defineProperty()

  3. ์œ„์˜ ์ฝ”๋“œ๋Š” mainObj์˜ ์—ด๊ฑฐ๊ฐ€๋Šฅํ•œ(enumerable) ์†์„ฑ๋งŒ ๋ณต์‚ฌํ•œ๋‹ค.
  4. ์›๋ณธ ๊ฐ์ฒด์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ๋ณต์‚ฌ๋ณธ๊ณผ ์›๋ณธ ๊ฐ„์— ๊ณต์œ ๋˜์–ด ๊ฐ๊ฐ์˜ ์†์„ฑ์ด ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

์–•์€ ๊ฐ์ฒด ๋ณต์‚ฌ

์ตœ์ƒ ์œ„ ์†์„ฑ์ด ์•„๋ฌด๋Ÿฐ ์ฐธ์กฐ ์—†์ด ๋ณต์‚ฌ๋˜๊ณ  ๊ฐ’์ด ๊ฐ์ฒด๋กœ์„œ ์ฐธ์กฐ๋กœ ๋ณต์‚ฌ๋˜๋Š” ์†Œ์Šค ์†์„ฑ์ด ์กด์žฌํ•  ๋•Œ ๊ฐœ์ฒด๋Š” ์–•๊ฒŒ ๋ณต์‚ฌ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์›๋ณธ ๊ฐ’์ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฐธ์กฐ ๊ฐ’๋งŒ ๋ณต์‚ฌ ๋œ๋‹ค.

ํ•„๋…: Learn React from Scratch! (2019 Edition)

์–•์€ ๋ณต์‚ฌ๋Š” ์ตœ์ƒ์œ„ ์†์„ฑ์„ ๋ณต์ œํ•˜์ง€๋งŒ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋Š” ์›๋ณธ(์†Œ์Šค)๊ณผ ๋ณต์‚ฌ๋ณธ(๋Œ€์ƒ) ๊ฐ„์— ๊ณต์œ ๋œ๋‹ค.

Object.assign() ๋ฉ”์†Œ๋“œ ์ด์šฉํ•˜๊ธฐ

Object.assign() ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

let obj = {
  a: 1,
  b: 2,
};
let objCopy = Object.assign({}, obj);
console.log(objCopy);
// Result - { a: 1, b: 2 }

๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—”, ์ง€๊ธˆ๊นŒ์ง€ ํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ž‘ ๋˜‘๊ฐ™์•„ ๋ณด์ธ๋‹ค. ์ด๋ฏธ copy ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ obj๋ฅผ ๋ณต์‚ฌ ํ–ˆ์—ˆ๋‹ค. ์œ„์™€ ๋‹ค๋ฅด๊ฒŒ ๋ถˆ๋ณ€์„ฑ(immutability)์„ ๊ฐ€์ง€๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

let obj = {
  a: 1,
  b: 2,
};
let objCopy = Object.assign({}, obj);

console.log(objCopy); // result - { a: 1, b: 2 }
objCopy.b = 89;
console.log(objCopy); // result - { a: 1, b: 89 }
console.log(obj); // result - { a: 1, b: 2 }

์œ„์˜ ์ฝ”๋“œ์—์„œ, objCopy์˜ b ์†์„ฑ ๊ฐ’์„ 89๋กœ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ฝ˜์†”์— ์ˆ˜์ •๋œ objCopy ๊ฐ’์„ ์ฐ์–ด๋ณด๋ฉด ๋ณ€๊ฒฝ ๋‚ด์šฉ์€ objCopy์—๋งŒ ์ ์šฉ๋œ๋‹ค. ์ฝ”๋“œ ๋งˆ์ง€๋ง‰ ์ค„์„ ๋ณด๋ฉด obj ๊ฐ์ฒด๊ฐ€ ์˜จ์ „ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์›๋ณธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ์ฐธ์กฐ๋„ ์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Object.assign()์˜ ๋ฌธ์ œ์ 

์„ฑ๊ณต์ ์œผ๋กœ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์—ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์–•์€ ๋ณต์‚ฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€? ์ด ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

let obj = {
  a: 1,
  b: {
    c: 2,
  },
}
let newObj = Object.assign({}, obj);
console.log(newObj); // { a: 1, b: { c: 2} }

obj.a = 10;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 1, b: { c: 2} }

newObj.a = 20;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 20, b: { c: 2} }

newObj.b.c = 30;
console.log(obj); // { a: 10, b: { c: 30} }
console.log(newObj); // { a: 20, b: { c: 30} }

// Note: newObj.b.c = 30; Read why..

์™œ obj.b.c = 30 ์ผ๊นŒ?

์ด ๊ฒƒ์ด Object.assign() ์˜ ๋ฌธ์ œ์ ์ด๋‹ค. Object.assign()์€ ์–•์€ ๋ณต์‚ฌ๋ณธ๋งŒ ๋งŒ๋“ ๋‹ค. newObj.b ์™€ obj.b ๋‘˜ ๋‹ค ๊ฐ๊ฐ์˜ ๋ณต์‚ฌ๋ณธ์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ณ , ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋ณต์‚ฌ๋œ ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฐธ์กฐ์— ์ ์šฉ๋œ๋‹ค. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์„๊นŒ? ๋‹ค์Œ ์„น์…˜์— ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค.

์ฐธ๊ณ  : ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋ฐ ์—ด๊ฑฐ ๋ถˆ๊ฐ€๋Šฅ ์†์„ฑ์˜ ์†์„ฑ์€ ๋ณต์‚ฌ ํ•  ์ˆ˜ ์—†๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด์ž:

let someObj = {
  a: 2,
}

let obj = Object.create(someObj, { 
  b: {
    value: 2,  
  },
  c: {
    value: 3,
    enumerable: true,  
  },
});

let objCopy = Object.assign({}, obj);
console.log(objCopy); // { c: 3 }
  • someObj์€ obj์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์กด์žฌํ•˜๋ฏ€๋กœ ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์†์„ฑ b๋Š” ์—ด๊ฑฐ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ์•„๋‹ˆ๋‹ค.
  • ์†์„ฑ c๋Š” enumerable ์†์„ฑ ์„œ์ˆ ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณต์‚ฌ ๋œ ๊ฒƒ์ด๋‹ค.

๊นŠ์€ ๊ฐ์ฒด ๋ณต์‚ฌ

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๋งˆ์ฃผํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•  ๊ฒƒ์ด๋‹ค. ์‚ฌ๋ณธ๊ณผ ์›๋ž˜์˜ ๊ฐ์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ณต์œ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ์›๋ณธ์˜ ์‚ฌ๋ณธ์ด ๋  ๊ฒƒ์ด๋‹ค. Object.assign()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

JSON.parse(JSON.stringify(object))๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์ด์ „์— ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ์ด์ œ newObj.b๋Š” ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ์‚ฌ๋ณธ์„ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ๊ฐ์ฒด๋ฅผ ๊นŠ์ด ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

let obj = { 
  a: 1,
  b: { 
    c: 2,
  },
}

let newObj = JSON.parse(JSON.stringify(obj));

obj.b.c = 20;
console.log(obj); // { a: 1, b: { c: 20 } }
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object Intact!)

๋ถˆ๋ณ€์„ฑ๋„ ๊ฐ€์ง„๋‹ค.

JSON.parse(JSON.stringify(object))์˜ ๋ฌธ์ œ์ 

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์ž.

๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ

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

let obj = {
  name: 'scotch.io',
  exec: function exec() {
    return true;
  },
}

let method1 = Object.assign({}, obj);
let method2 = JSON.parse(JSON.stringify(obj));

console.log(method1); //Object.assign({}, obj)
/* result
{
  exec: function exec() {
    return true;
  },
  name: "scotch.io"
}
*/

console.log(method2); // JSON.parse(JSON.stringify(obj))
/* result
{
  name: "scotch.io"
}
*/

๊ฒฐ๊ณผ๋Š”, Object.assign()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด์— JSON.parse(JSON.stringify(obj) ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

์ˆœํ™˜ ๊ฐ์ฒด ๋ณต์‚ฌ

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

JSON.parse(JSON.stringify(object)) ์‚ฌ์šฉํ•˜๊ธฐ

JSON.parse(JSON.stringify(object)) ์‚ฌ์šฉํ•ด์„œ ์ˆœํ™˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด๋ณด์ž.:

// circular object
let obj = { 
  a: 'a',
  b: { 
    c: 'c',
    d: 'd',
  },
}

obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;

let newObj = JSON.parse(JSON.stringify(obj));

console.log(newObj); 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

/resource/yongkwan/18/01.png

JSON.parse(JSON. stringify(obj)๋Š” ๋ถ„๋ช…ํžˆ ์ˆœํ™˜ ๊ฐ์ฒด์— ํšจ๊ณผ๊ฐ€ ์—†๋‹ค.

Object.assign()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœํ™˜ ๊ฐ์ฒด ๋ณต์‚ฌํ•˜๊ธฐ

Object.assign() ์‚ฌ์šฉํ•ด์„œ ์ˆœํ™˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด๋ณด์ž.:

let obj = { 
  a: 'a',
  b: { 
    c: 'c',
    d: 'd',
  },
}

obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;

let newObj2 = Object.assign({}, obj);

console.log(newObj2); 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

/resource/yongkwan/18/02.png

Object.assign()์€ ์–•์€ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๊นŠ์€ ๋ณต์‚ฌ์—๋Š” ํšจ๊ณผ๊ฐ€ ์—†๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ์ˆœํ™˜ ๊ฐ์ฒด ํŠธ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž. ๊ทธ๊ณณ์—์„œ ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

์ „๊ฐœ ๊ตฌ๋ฌธ (...) ์‚ฌ์šฉํ•˜๊ธฐ

ES6์—๋Š” ์ด๋ฏธ ๋ฐฐ์—ด ํ•ด์ฒด ํ• ๋‹น์„ ์œ„ํ•œ ๋‚˜๋จธ์ง€ ์š”์†Œ(rest elements)์™€ ๊ตฌํ˜„๋œ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์œ„ํ•œ ๋ถ„์‚ฐ ์š”์†Œ(spread elements)๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ถ„์‚ฐ ์š”์†Œ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด์ž.

const array = [
  "a",
  "c",
  "d", {
    four: 4
  },
];
const newArray = [...array];
console.log(newArray);
// Result 
// ["a", "c", "d", { four: 4 }]

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ๋Œ€ํ•œ ํ™•์‚ฐ ์†์„ฑ(spread property)์€ ํ˜„์žฌ ECMAScript์— ๋Œ€ํ•œ 3๋‹จ๊ณ„ ์ œ์•ˆ์ด๋‹ค. ๊ฐ์ฒด์˜ ์Šคํ”„๋ ˆ๋“œ ์†์„ฑ์€ ์ž์ฒด ๊ฐ์ฒด์˜ ์—ด๊ฑฐ๊ฐ€๋Šฅ ์†์„ฑ์„ ์›๋ณธ ๊ฐ์ฒด์—์„œ ๋Œ€์ƒ ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•œ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ์ œ์•ˆ์ด ๋ฐ›์•„๋“ค์—ฌ์ง€๋ฉด ๊ฐœ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

let obj = {
  one: 1,
  two: 2,
}

let newObj = { ...z };

// { one: 1, two: 2 }

์ฐธ๊ณ : ์–•์€ ๋ณต์‚ฌ์—๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

๊ฒฐ๋ก 

JavaScript์—์„œ ๊ฐœ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๋‹ค. JavaScript๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ณ  ์–ธ์–ด๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์— ๋งค์šฐ ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธ€์ด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ์ง๋ฉดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ด ์žˆ๋‹ค๋ฉด ๊ณต์œ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ํ•ดํ”ผ์ฝ”๋”ฉ!