길/Javascript 기본

Object.assign과 Shallow/Deep copy

7he8oy 2021. 1. 28. 09:55

Object.assign(target, ...sources)

이 메소드는 source object들의 enumerable한 property를 target object에 shallow copy한다.

(확실한 표현을 위해 영어를 사용함)

 

enuerable : for.. in...과 같은 operator로 뽑아낼 수 있는 것. (아직 잘 모르겠지만 object를 만들 때, 숨겨진 속성들이 만들어지는 듯 하다)
shallow copy : 얕은 복사라고 하던데, 대상 object의 가장 바깥 층위만 복사하는 것으로 보인다. 따라서 객체 안에 property로 객체가 있다면,
                         객체 안의 객체는 주소 값이 그대로 따라온다. 따라서 복사된 객체에서 객체 안의 객체를 수정하게 되면 원 객체에도 수정이 된다.

 

자세한 설명은 MDN의 코드를 복사하는 것으로 갈음하겠다.

 

function test() {
  'use strict';

  let obj1 = { a: 0 , b: { c: 0}};
  let obj2 = Object.assign({}, obj1);
  console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}

  obj1.a = 1;
  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
  console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}

  obj2.a = 2;
  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
  console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}}

  obj2.b.c = 3;
  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}}
  console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}

  // Deep Clone
  obj1 = { a: 0 , b: { c: 0}};
  let obj3 = JSON.parse(JSON.stringify(obj1));
  obj1.a = 4;
  obj1.b.c = 4;
  console.log(JSON.stringify(obj3)); // { "a": 0, "b": { "c": 0}}
}

test();

 

' > Javascript 기본' 카테고리의 다른 글

일급 객체(first-class)  (0) 2021.02.01
arguments object과 array like object  (0) 2021.01.28
in 연산자  (0) 2021.01.27
Hoisting  (0) 2021.01.27
const에 array, object 재할당  (0) 2021.01.27