const obj1 = {value : 1};
const obj2 = obj1;
obj2.value = 2;
console.log(obj1.value) // 2
console.log(obj1===obj2) // true
원시값과 참조값
- 원시값 - Number, String, Boolean, Null, Undefined, Biglnt, Symbol
- 참조값 - Object, Array, Function
const obj = { a: 1 };
const newObj = Object.assign({}, obj);
newObj.a = 2;
console.log(obj); // { a: 1 }
console.log(obj === newObj); // false
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = Object.assign({}, obj);
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 3 } }
console.log(obj.b.c === newObj.b.c); // true
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = { ...obj };
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 3 } }
console.log(obj.b.c === newObj.b.c); // true
객체의 깊은 복사를 위해 JSON 객체의 stringify(), parse() 메소드를 사용할 수 있다.
JSON.stringify() 메소드는 인수로 객체를 받으며 받은 객체는 문자열로 치환되며,
JSON.parse() 메소드는 문자열을 인수로 받으며, 받은 문자열을 객체로 치환한다.
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = JSON.parse(JSON.stringify(obj));
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 2 } }
console.log(obj.b.c === newObj.b.c); // false
문제점
- 성능이 다른 방법에 비해 느리다
- JSON.stringify() 메소드는 함수를 만났을 때 undefined로 처리한다는 점
function deepCopy(obj){
if(obj===null || typeof(obj)!=="object"){
return obj;
}
let copy ={};
for (let key in obj) {
if(obj.hasOwnProperty(key)){
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
const lodash = require("lodash");
const obj = {
a: 1,
b: {
c: 2,
},
func: function () {
return this.a;
},
};
const newObj = lodash.cloneDeep(obj);
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 2 }, func: [Function: func] }
console.log(obj.b.c === newObj.b.c); // false