shallow Copy 와 Deep Copy 의 위험성 Object.assign

2018. 8. 31. 15:49프로그래밍/Jscript

Object.assign 의 위험성.


다음 object in object 복제는 안된다는.. 


일명 shallow Copy 와 Deep Copy  


Shallow Copy 를 피하려고 Object.assign 을 사용하였으나 이중적인 object in object 구조시 shallow copy 가 되어버린..


일반적인 방식은 다음과 같다.

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

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


 그러나 obj 다음과 같은 구조시에는 우리가 원하지 않는 값으로 나옴


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..



b.c 가 하나만 바꿔야 되지만 둘다 바뀌는 문제가 된다.


그래서 이야기하는건 다음과 같은 함수를 -_-;; 쓰자라는 것 ㅋㅋ


function cloneObject(obj) {
var clone = {};
for(var i in obj) {
if(obj[i] != null && typeof(obj[i])=="object")
clone[i] = cloneObject(obj[i]);
else
clone[i] = obj[i];
}
return clone;

}