이 전에 원시 자료형과 참조 자료형에 대해서 배웠다.
그리고 type 별로 일반적인 자료 복사가 이루어 졌을 때 어떠한 변화가 일어나는지 알아보았다.
let a =1;
let b = a;
b=2
console.log(a); // output = 1
console.log(b); // output = 2
let e = [10, 20, 30];
let f = e; // e와 f는 동일한 reference 를 가지게 된다.
f[0] = 50;
console.log(e); // output[50, 20, 30]
console.log(f); // output[50, 20, 30]
얕은 복사는 reference의 복사가 일어나 같은 reference를 가지게 된다.
const obj1 = { a: 1, b: 2};
const obj2 = obj1;
console.log( obj1 === obj2 ); // true
obj2.b = 'Hi';
console.log ( obj1.b ); // "Hi"
console.log ( obj2.b ); // "Hi"
깊은 복사는 객체의 property나 배열의 element들만 복사해서,
원본과는 다른 새로운 reference를 (새로운 주소) 가지게 되는 복사를 의미한다.
const obj1 = { a: 1, b: 2, c: 3 };
const obj2 = {...obj1 };
console.log( obj1 === obj2 ) // false
obj2.c = "Hello!";
console.log( obj1.c ) // 3
console.log( obj2.c ) // "Hello!"
하지만 이 방법은 1 depth 까지만 깊은 복사가 일어난다.
뒤에서 자세히 알아보자.
const obj1 = { a: 1, b: 2, c: 3 };
const obj2 = Object.assign({}, obj1);
obj2.a = "Hello!";
console.log( obj1 === obj2 ) // false
console.log( obj1.a ) // 1
console.log( obj2.a ) // "Hello!
하지만 이 방법도 1 depth 까지만 깊은 복사가 일어난다.
const obj1 = {team: "DWG", rank: 1, member: ["Khan", "Canyon", "Showmaker"] };
const obj2 = { ...obj1 };
const obj3 = Object.assign({}, obj1);
console.log(obj1 === obj2) // false
console.log(obj2 === obj3) // flase
// 깊은 복사가 잘 실행된 것 같아 보이지만
console.log(obj1.member === obj2.member) // true
console.log(obj2.member === obj3.member) // true
// 각 객체의 member의 reference는 모두 같다
obj2.member[0] = "Beryl"
console.log(obj1.member[0]); // "Beryl"
console.log(obj2.member[0]); // "Beryl"
console.log(obj3.member[0]); // "Beryl"
// member의 reference가 같기 때문에 복사본을 변경하면 원본, 복사본 모두 value 변경.
const obj1 = {team: "DWG", rank: 1, member: ["Khan", "Canyon", "Showmaker"] };
const obj2 = { ...obj1, member: [...obj1.member] };
console.log(obj1 === obj2) // false
console.log(obj1.member === obj2.member) // false
그런데 이게 10depth , 20depth를 가진다면? 이건 너무 빡세다....
이러한 방법들이 있다고는 하는데 아직 배우지 못했으므로...
공부하고나서 자세한 방법은 포스팅 하도록 하겠다.