자바스크립트에서의 복사는 얕은 복사(shallow copy)와 깊은 복사(deep copy)가 존재함.
깊은 복사(Deep Copy) : 원시 타입(primitive type)의 데이터가 복사 될 때는 새로운 메모리 공간을 생성하여 메모리에 독립적은 값을 저장
얕은 복사 (Shallow Copy) : object(객체, 배열, 함수)와 같은 참조 타입(reference type) 데이터는 애초에 저장 시 데이터에 대한 주소가 저장되기 때문에 복사 시 값 자체가 아닌 해당 값을 가리키는 주소가 복사됨
원시값 : Number / String / Boolean / Null / Undefined
참조값 : Object / Symbol
원시값 : 값을 복사할 때 복사된 값을 다른 메모리에 할당함. 그래서 원래의 값과 복사된 값이 서로에게 영향을 미치지 않음
const a = 1;
let b = a;
b =2
console.log(a); //결과값 : 1
console.log(b); //결과값 : 2
const a = {number: 1};
let b = a;
b.number = 2
console.log(a); //결과값 : {number: 2}
console.log(b); //결과값 : {number: 2}
const obj = {
a: 1,
b: {
c: 2,
},
};
const copyObj = Object.assign({}, obj);
copyObj.b.c = 3
obj === copyObj //결과값 : false
obj.b.c === copyObj.b.c //결과값 : true
const obj = {
a: 1,
b: {
c: 2,
},
};
const copyObj = {...obj}
copyObj.b.c = 3
obj === copyObj //결과값 : false
obj.b.c === copyObj.b.c //결과값 : true
const obj = {
a: 1,
b: {
c: 2,
},
};
function copyObj(obj) {
const result = {};
for (let key in obj) {
if (typeof obj[key] === 'object') {
result[key] = copyObj(obj[key]);
} else {
result[key] = obj[key];
}
}
return result;
}
const copiedObj = copyObj(obj);
copiedObj.b.c = 3
obj.b.c === copiedObj.b.c //결과값: false (obj.b.c : 2 / copiedObj.b.c: 3)
const obj = {
a: 1,
b: {
c: 2,
},
};
const copyObj = JSON.parse(JSON.stringify(obj));
copyObj.b.c = 3
obj.b.c === copyObj.b.c //결과값: false (obj.b.c : 2 / copiedObj.b.c: 3)
// 해당 모듈 설치
npm i lodash
const obj = {
a: 1,
b: {
c: 2,
},
};
const copiedObj = _.cloneDeep(obj);
copiedObj.b.c = 3
obj.b.c === copiedObj.b.c //결과값: false (obj.b.c : 2 / copiedObj.b.c: 3)
.
.
.
.
.
참조
https://velog.io/@th0566/Javascript-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC
https://velog.io/@nomadhash/Java-Script-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC%EC%99%80-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-1dus9z79
https://velog.io/@recordboy/JavaScript-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%ACShallow-Copy%EC%99%80-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%ACDeep-Copy