const a = [];
const b = 'hello';
const c = {};
const arr = [a, b, c];
// 객체를 다른 변수에 넣으면 '참조'.
// 참조관계
const arr1 = arr;
arr1[1] = 'hi';
console.log(arr[1]); // 'hi'
const arr2 = [...arr];
arr2[1] = 'dumb';
// arr2[1]를 dumb로 바꿔도 arr[1]은 'hi'로 남아있다.
arr[1]; // 'hi'
// 얕은 복사의 문제점
// 문자열은 안 바뀌는데, 배열은 다른 하나를 바꾸니까 따라서 바뀜
arr2[0].push(1); // 1
arr[0]; // [1]
// 결론: 문자열, 숫자, bool, null, undefined 같은 원시값(객체가 아닌 값들)
// 은 참조가 없기때문에 복사가 가능
// a, c는 원시값이 아니기 때문에 참조가 가능
// [a, b, c] => 겉 껍데기는 복사가 되고, 내부 객체는 참조가 된다.
// 내부에 있는 객체마저도 참조관계를 끊고 싶으면 깊은 복사를 사용
// 가장 쉬운 깊은 복사 방법은
const arr3 = JSON.parse(JSON.stringify(arr)); // 만능 깊은 복사는 아니다(prototype에는 적용 안됨)
arr3[0].push(2); // 2
arr[0]; // 1 => 바뀌지 않는다.
// 참조, 얕은 복사, 깊은 복사
// 깊은 복사는 보통 라이브러리를 사용한다.
// ex) lodash clone
// 슬라이스도 대표적인 얕은복사.