passed by value : Boolean, String, Null. Undefined, Number. 원시 타입이라 부른다.
passed by reference : Array, function, Object.
const user = {
name: 'Malza',
age: 29,
emails: ['[email protected]'],
};
//const copyUser = Object.assign({}, user);
const copyUser = { ...user }; // 얕은 복사
console.log(copyUser === user); // false
user.age = 22;
console.log('user', user); // age 22
console.log('copyUser', copyUser); // age 29
user.emails.push('[email protected]');
console.log(user.emails); // ["[email protected]", "[email protected]"]
console.log(copyUser.emails); // ["[email protected]", "[email protected]"]
// 둘이 같은 결과가 나온다. 왜???
// emails 는 배열 데이터로 참조형이다. 참조형 데이터를 따로 복사 처리 하지 않았다.
// 따라서 같은 메모리 주소를 공유하게 된다. 당연히 결과가 같아진다.
// lodash 의 도움을 받아서 깊은 복사를 해 보자.
import _ from 'lodash';
const user = {
name: 'Malza',
age: 29,
emails: ['[email protected]'],
};
const copyUser = _.cloneDeep(user); // 깊은 복사
console.log(copyUser === user); // false
user.age = 22;
console.log('user', user); // age 22
console.log('copyUser', copyUser); // age 29
user.emails.push('[email protected]');
console.log(user.emails); // ["[email protected]", "[email protected]"]
console.log(copyUser.emails); // ["[email protected]"]
// 둘이 다른 것을 확인 할 수 있다.
// lodash 의 문서에서 보면 알겠지만 재귀적으로 모든 값을 복사 해 온다고 한다.