1. 깊은 복사(Deep copy)
- 원본과 복사본이 서로 다른 참조(주소)를 가지는 것을 말한다.
1) 원시 자료형
- 원시 자료형 데이터를 복사할 때 그 값은 또 다른 독립적인 메모리 공간에 할당되기 때문에, 복사를 하고 값을 수정해도 기존 원시값을 저장한 변수에는 영향을 미치지 않는다. 즉, 원시 값을 할당한 변수를 다른 변수에 할당하는 것을 깊은 복사라고 한다.
let testOne = 'apple'
let testTwo = testOne
console.log(testOne === testTwo)
testTwo = 'orange'
console.log(testOne === testTwo)
console.log(testOne)
console.log(testTwo)
2) 참조 자료형
- 객체를 프로퍼티 값으로 갖는 객체(객체 안의 객체)의 경우 객체에 중첩되어 있는 객체까지 모두 복사하는 것을 깊은 복사라고 한다.
2-1. JSON.parse & JSON.stringify
2-2. Lodash 라이브러리 사용
const _ =require('lodash')
const c2 = _.cloneDeep(o)
console.log(c2 === o)
console.log(c2.x === o.x)
2-3. 재귀 함수
2. 얕은 복사(Shallow copy)
- 원본과 복사본이 동일한 참조(주소)를 가지는 것을 말한다.
1) 참조 자료형
- 참조 자료형 데이터를 복사할 때는 변수가 객체의 참조(주소)를 가리키고 있기 때문에 복사된 변수 또한 객체가 저장된 메모리 공간의 참조(주소)를 가리키고 있다. 그래서 복사를 하고 객체를 수정하면 두 변수는 똑같은 참조(주소)를 가리키고 있기 때문에 기존 객체를 저장한 변수에 영향을 미친다. 즉, 객체를 할당한 변수를 다른 변수에 할당하는 것을 얕은 복사라고 한다.
let testOne = {apple : 1, orange : 2}
let testTwo = testOne
console.log(testOne === testTwo)
testTwo.orange = 3
console.log(testOne === testTwo)
console.log(testOne)
console.log(testTwo)
- 객체를 프로퍼티 값으로 갖는 객체(객체 안의 객체)의 경우 한 단계까지만 복사하는 것을 얕은 복사라고 한다.
- 하지만
spread
문법을 이용한 복사는 '1 depth' 까지는 '깊은 복사'가 이루어진다. 이후 '2 depth'부터는 얕은 복사가 이루어진다.
let testOne = {apple : 1, orange : {fruit : 2}}
let testTwo = {...testOne}
testTwo.orange = 3
console.log(testOne === testTwo)
console.log(testOne.orange === testTwo.orange)
console.log(testOne)
console.log(testTwo)
const obj1 = { a: { b:1, c:1 }, d: 2};
const obj2 = { ...obj1, a:{ ...obj1.a } };
obj1.a.b = 100;
console.log(obj1 === obj2)
console.log(obj2.a.b)