데이터를 전달할 때 원시 자료형(Primitive type data)
은 value
를 복사하여 전달하고,(Call by Value)
참조 자료형(Reference type data)
은 reference
를 전달한다. (Call by Reference)
참조 자료형을 복사하는 경우 일어나며, 원본 객체가 담겨있는 변수를 새로운 변수에 할당했을 때 값이 아닌 주소값을 전달한다. 따라서, 동일한 주소를 공유하고 있기 때문에 둘 중 하나의 변수에서 값의 변경이 일어나면 다른 변수의 값에도 영향을 준다.
let obj = {a: 1, b: 2};
let obj1 = obj;
obj1.a = 3;
console.log(obj1.a); // 3
열거할 수 있는 하나 이상의 원본 객체로부터 다른 객체로 속성을 복사할 때 사용하며, 대상 객체를 반환하는 메서드로, 객체를 쉽게 병합할 수 있게 한다.
let obj = { a: 1, b: 2, c: {c1: 3, c2: 4}};
let obj1 = Object.assign({}, obj);
obj1.a = 3;
console.log( obj === obj1 ) // false
console.log( obj.a ) // 1
console.log( obj.c === obj1.c ) // true..? (shallow copy)
단, 예시와 같이 객체안에 객체가 있는 경우(2차원 객체) 얕은 복사가 이루어지기 때문에 완벽한 깊은 복사가 아니다.
spread 문법을 이용한 방법이다.
let obj = { a: 1, b: 2, c: {c1: 3, c2: 4}};
let obj1 = { ...obj };
obj1.a = 3;
console.log( obj === obj1 ) // false
console.log( obj.a ) // 1
console.log( obj.c === obj1.c ) // true..? (shallow copy)
Object.assign()
과 마찬가지로 2차원 객체가 있다면 얕은 복사가 이루어지기 때문에 완벽한 깊은 복사라 할 수 없다.