let a = 10;
let b = a;
let obj1 = {c:10, d:'ddd'};
let obj2 = obj1
b = 15;
obj2.c = 20;
1. 변수 b에 새로운 데이터를 할당하여 주소값이 바뀜
2. obj2의 프로퍼티 값이 하나 바뀌었으므로, 해당 프로퍼티의 주소값은 새 데이터의 주소값으로 바뀌었으나 객체 자체의 주소값은 바뀌지 않아 obj1과 obj2의 주소값은 여전히 동일함
3. 프로퍼티의 주소값이 아예 새로운 데이터 주소값으로 바뀌어 버림 => '가변'
let a = 10;
let b = a;
let obj1 = {c:10, d:'ddd'};
let obj2 = obj1
b = 15;
obj2 = {c: 20, d: 'ddd'};
1. 객체의 프로퍼티 변경이 아닌 새로운 객체를 할당함으로써 주소값이 새로 변경됨
2. 기존 객체의 프로퍼티 값에는 변화가 없음
3. 새로운 객체에 대한 새로운 주소값을 받음
'가변' 참조형 데이터 자체를 바꿀때에는 적용되는 말이 아님 => 기존 데이터 값에는 변화가 없으므로!
참조형 데이터의 '가변'은 데이터 자체가 아니라 내부 프로퍼티를 바꿀때에만 성립함
바로 아래 단계의 값만 복사하는 방법
let copyShallowObject = function(target) {
let result = {};
for(let prop in target) {
result[prop] = target[prop];
}
return result;
};
내부의 모든 값들을 하나하나 찾아서 전부 복사하는 방법
let user = {
name: 'Kyoorim',
urls: {
lastName : 'LEE',
favoriteFood: 'greek yogurt',
favoritePuppy: 'zzang'
}
}
//urls 내부 프로퍼티까지 다 바꾸는 복사
객체의 깊은 복사를 수행하는 범용 함수
__proto__
나 getter/setter
등과 같이 JSON으로 변경할 수 없는 프로퍼티들은 복사가 되지 않음let copyDeepObject - function (target) {
let result = {};
if(typeof target === 'object' && target !== null) {
for(let prop in target) {
result[prop]= copyDeepObject(target[prop]);
}
}else {
result = target;
}
return result;
}
어떤 변수에 값을 지정할 수 있지만 지정하지 않았을 때, 즉 바구니는 있지만 바구니에 아무것도 없을 때
애초에 값이 비어있는 경우, 바구니 자체가 없는 경우