본문 바로가기

Dev-/java script, jQuery, Ajax

자바스크립트 중첩된 객체의 복사

let obj1 = {
name: 'obj1-name'
};
let obj2 = obj1;
obj2.name = 'NEW NAME'; /** obj1.name 도 NEW NAME으로 변한다. */

위와같이 =을 사용해 변수에 객체를 할당하게 되면

참조하는 주소를 복사하게 된다.


따라서 아래와 같이 복사를 해서 사용하게 된다.

let obj1 = {
name: 'obj1-name'
};
let obj2 = Object.assign({}, obj1);
obj2.name = 'NEW NAME'; /** obj1.name은 변하지 않는다. */



한가지 주의할 점은, 아래와 같이 객체가 중첩되었을 경우인데,

해당 내부 객체를 건드릴 경우, 기존 내부 객체와 같이 변경이 된다.

즉, 객체 내부객체가 존재한다면, Object.assign()은 생각대로 완전하게 복사되지 않는다.

let obj1 = {
name: 'obj1-name',
arr: [100, 200, 300]
};
let obj2 = Object.assign({}, obj1);

console.log(obj1.arr === obj2.arr); /** true */
obj2.arr.push(-1);
console.log(obj1.arr); /** obj1.arr, obj2.arr 둘 다 [100, 200, 300, -1] */


배열을 복사해주는 방법인 concat, slice를 이용해 일일히 복사해주어야 한다.

(ES6일 경우 전개연산자)