원시값 (string, number, boolean)의 경우 복사를 하고 복사본의 값을 바꿔도 원본의 값이 달라지지 않는다.
var fruit = 'orange';
var fruitCopy = fruit;
fruitCopy = 'strawberry'
console.log(`fruit = ${fruit}`);
console.log(`fruitCopy = ${fruitCopy}`);
fruit = orange
fruitCopy = strawberry
그러나 객체의 경우 복사를 하고 복사본의 값을 변경할 경우
원본의 내용이 변경된다.
객체는 대입하면 참조(얕은복사) 관계가 되기 때문이다.
//객체의 경우
var fruit = {
name: 'orange'
}
var fruitCopy = fruit;
fruitCopy.name = 'strawberry'
console.log(fruit.name); //strawberry
console.log(fruitCopy.name); //strawberry
//배열의 경우
var fruit = ['orange', 'strawberry', 'banana'];
var fruitCopy = fruit;
fruitCopy[0] = 'apple'
console.log(fruit[0]); //apple
console.log(fruitCopy[0]); //apple
//함수의 경우
var favorite = function(){}
favorite.fruit = 'strawberry'
favoriteCopy = favorite;
favoriteCopy.fruit = 'orange'
console.log(favorite.fruit); //orange
console.log(favoriteCopy.fruit); //orange
obj === obj2
가 true
일 경우 참조 (얕은 복사) 관계가 있는 것!
❓ 2단계 이상이란?: 객체안의 객체가 있을 경우
var obj1 = {
a : 1,
b : {c : 1}
}
var obj1 = {a : 1}
var obj2 = {};
//1.
Object.keys(obj).forEach(function(key){
obj2[key] = obj[key];
});
//2.
Object.assign(obj2, obj);
var arr1 = [1,2,3]
var arr2 = arr1.slice();
var obj3 = JSON.parse(JSON.stringify(obj1));
var arr3 = JSON.parse(JSON.stringify(arr1));