July 30, 2021
const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
}
};
const p2 = p1; // 참조 할당
p1.age = 30;
console.log(p1.age); // 30
console.log(p2.age); // 30p2에 p1을 할당할 때, 주소값이 할당되는 것이기 때문에 한 객체의 값을 수정하면 다른 객체의 값 또한 동일하게 변한다.
Object.assign(target, ...sources)메소드는 열거할 수 있는 하나 이상의 출처 객체(source)로부터 대상 객체(target)로 속성을 복사할 때 사용하고 대상 객체(target)를 반환한다.
const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
}
};
const target = {
position: 'Frontend',
};
const p2 = Object.assign(target, p1);
p2.age = 30
console.log(p1.age); // 20
console.log(target.age); // 30
console.log(p2.age); // 30p2의 age를 변경하더라도 p1의 age가 변경되지 않는다.const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
}
};
const p2 = Object.assign({}, p1);
p1.age = 30;
p1.name.first = 'Justin';
console.log(p1.name.first); // Justin
console.log(p2.name.first); // Justinp1의 age를 변경하더라도 p2의 age가 변경되지 않았지만 p1.name.first를 변경하니 p2.name.first도 변경되었다.const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
}
};
const p2 = { ...p1 };
p1.age = 30;
p1.name.first = 'Justin';
console.log(p2.age); // 20
console.log(p2.name.first); // JustinObject.assign() 과 동일하게 얕은 복사의 문제점을 가지고 있다.const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
},
sayHello: () => {
console.log('hello world!');
},
};
const p2 = JSON.parse(JSON.stringify(p1));
p1.age = 30;
p1.name.first = 'justin';
console.log(p1); // { age: 30, name: { first: "Justin", last: "Jung" }, sayHello: f };
console.log(p2); // { age: 20, name: { first: "Jessie", last: "Jung" } };JSON.stringify : 자바스크립트 객체를 JSON 문자열로 변환JSON.parse : JSON 문자열을 자바스크립트 객체로 변환이 방법의 문제점
JSON.stringify 메소드가 function을 undefined로 처리한다. 따라서 p2에서는 sayHello 라는 함수가 복사되지 않았다.const clonedeep = require("lodash.clonedeep");
const p1 = {
age: 20,
name: {
first: 'Jessie',
last: 'Jung'
},
sayHello: () => {
console.log('hello world!');
},
}
const p2 = clonedeep(p1);
p1.age = 30;
p1.name.first = 'justin';
console.log(p1); // { age: 30, name: { first: "Justin", last: "Jung" }, sayHello: f };
console.log(p2); // { age: 20, name: { first: "Jessie", last: "Jung" }, sayHello: f };
p2.sayHello(); // hello world!JSON.parse(JSON.stringify()) 방법의 문제점이였던 함수 복사도 가능하다.