let a; //주소: 0x01234 값: Undefined
a = 10; //주소: 0x02345 값: 10
값 그대로(by value)
저장, 할당, 복사// 원시타입은 값이 복사되어 전달
let a = 1;
let b = a; //1
b = 2;
console.log(a); //1
console.log(b); //2
참조에 의해(by reference)
저장, 복사// 객체타입은 참조값(메모리주소, 레퍼런스)가 복사되어 전달
let obj = {
//0x1234
name: 'apple',
};
let obj2 = obj; //참조값을 복사 - 0x1234
console.log(obj); //{ name: 'apple' }
console.log(obj2); //{ name: 'apple' }
obj2.name = 'banana';
console.log(obj); //{ name: 'banana' }
console.log(obj2); //{ name: 'banana' }
//참조하고 있는 주소값이 같다.
console.log(obj == obj2); //true
console.log(obj === obj2); //true
이렇게 원래 값과 복사한 값이 같은 주소값을 보고 있으면 얕은 복사
Spread Operator (...)
가 있다.let obj = {
name: 'apple',
};
let obj2 = { ...obj, name: 'orange' };
console.log(obj); //{ name: 'apple' }
console.log(obj2); //{ name: 'orange' }
console.log(obj === obj2); //false
false
let a = [[1], [2], [3]];
let b = [...a];
b.shift().shift(); // 1
console.log(b); //[ [ 2 ], [ 3 ] ]
console.log(a); //[ [], [ 2 ], [ 3 ] ]
참고: Spread 문법은 배열을 복사할 때 1 레벨 깊이에서 효과적으로 동작합니다. 그러므로, 위와 같이 다차원 배열을 복사하는것에는 적합하지 않을 수 있습니다. (Object.assign()과 전개 구문이 동일합니다)
완전한 깊은 복사를 구현하려면? - 이 방법에 대해서 공부해서 새 글로 정리할 예정.