참조에 의한 객체 복사
- 객체와 원시 타입의 근본적인 차이 중 하나는 객체는 ‘참조에 의해(by reference)’ 저장되고 복사된다는 것
- 원시값(문자열, 숫자, 불린 값)은 ‘값 그대로’ 저장·할당되고 복사
let message = "Hello!";
let phrase = message;
let user = {
name: "John"
};
- 객체는 메모리 내 어딘가에 저장되고, 변수 user엔 객체를 '참조’할 수 있는 값이 저장
- 객체가 할당된 변수를 복사할 땐 객체의 참조 값이 복사되고 객체는 복사되지 않음
let user = { name: "John" };
let admin = user;
- 변수는 두 개이지만 각 변수엔 동일 객체에 대한 참조 값이 저장되기 때문에, 객체에 접근하거나 객체를 조작할 땐 여러 변수를 사용 가능
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete';
alert(user.name);
객체 복사, 병합 및 Object.assign
- 기존에 있던 객체와 똑같으면서 독립적인 객체를 만들고 싶은 경우, 새로운 객체를 만든 다음 기존 객체의 프로퍼티들을 순회해 원시 수준까지 프로퍼티를 복사
let user = {
name: "John",
age: 30
};
let clone = {};
for (let key in user) {
clone[key] = user[key];
}
clone.name = "Pete";
alert( user.name );
Object.assign
Object.assign(dest, [src1, src2, src3...])
- 첫 번째 인수
dest
는 목표로 하는 객체
- 이어지는 인수
src1, ..., srcN
는 복사하고자 하는 객체
- 객체
src1, ..., srcN
의 프로퍼티를 dest
에 복사
dest
를 제외한 인수(객체)의 프로퍼티 전부가 첫 번째 인수(객체)로 복사
- 마지막으로
dest
를 반환
let user = {
name: "John",
age: 30
};
let clone = Object.assign({}, user);
let user = { name: "John" };
Object.assign(user, { name: "Pete" });
alert(user.name);
let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
Object.assign(user, permissions1, permissions2);
Object.assign
로 만든 얕은 복사본의 경우, 중첩 객체를 처리하지 못함
- 중첩 객체 처리를 위한 깊은 복사본을 만들기 위해서는 자바스크립트 라이브러리 lodash의 _.cloneDeep(obj) 메서드 사용