
복사본의 속성이 복사본이 만들어진 원본 객체와
같은 참조를 공유하는 복사
➡️ 원본, 복사본을 변경하면 다른 객체 또한 변경될 수 있음
복사본의 속성이 복사본이 만들어진 원본 객체와 모두 다른 참조를 공유하는 복사; 내부 값을 가지고 완전히 새로운 객체를 복사해내는 것
= 만 써도 깊은 복사가 가능한다let a = 10 // (1)
let b = a // (2)
a = 20 // (3)
대체된게 아니라, 20을 할당할 새로운 메모리 주소 공간이 생기고, a가 이 새로운 메모리 공간을 참조 한다주소값을 할당한다obj 객체에는 a가 저장된 주소값, b가 저장된 주소값이 할당된다let obj1 = {
a: 10,
b: 20
}
객체에 할당된 주소값을 복사한다obj1에 할당된 주소값을 복사하는 것이다obj1이 가리키는 a, b의 주소값이 변경된 것이 아니기 때문에 복사본이 변경된다let obj2 = obj1 // obj1의 참조값이 obj2로 복사
obj1.a = 1020
console.log(obj2.a) // 1020
=로 원하는 복사를 할 수 없다객체가 몇차원이냐에 따라 얕은 복사가 될 수도, 깊은 복사가 될 수도 있다
... 연산자(...iterableObj)해당 객체의 1차원 단계의 값의 참조값을 복사한다
let arr = [1,2,3]
let copied = [...arr] // (*)
copied.push(9999)
console.log(arr) // [1,2,3]
1,2,3 의 참조값을 복사하여 새로운 배열 안에 넣었기 때문에 효과적으로 복사가 이루어짐(*) 라인에서 [] 를 통해 새로운 배열 객체가 만들어짐let arr = [[1,2,3],[4,5,6]]
let copied = [...arr]
copied[0].push(9999)
console.log(arr[0]) // [1,2,3,9999]
[1,2,3] 과 [4,5,6] 의 참조값을 복사한 것이기 때문에 여전히 그 내부의 값은 같은 참조값을 가지고 있어서 제대로 복사가 안된다Object.assign()객체의 속성을 복사해 붙여 넣고, 복사된 객체를 반환하는 메소드
... 연산자와 같은 특징을 가진다, 즉, 1차원 객체는 정상적으로 깊은 복사가 되지만 그 이상 차원에서는 제대로 복사가 되지 않는다var deepCopy = function (obj) {
var result = {};
if (typeof obj === 'object' && obj !== null) {
for (var prop in obj) {
result[obj] = deepCopy(obj[prop]);
}
} else {
result = obj;
}
return result;
};
JSON.stringfy(obj) : 값이나 객체를 JSON 문자열로 변환JSON.parse() : 문자열 분석 후 그 결과에서 값이나 객체 생성React component는 props나 state의 값이 변화할 때 DOM을 다시 그린다.
그리고 그 값이 변화하는 걸 확인할 때얕은 비교를 활용한다.
해당 객체의 주소를 바꿔야 한다const [data, setData] = useState({
name: 'kaya',
id: 1234,
information: {
phone: '1234-1234',
email: 'hello@gmail.com'
}
})
<button onclick={() => {
data.information.phone = '5678-5678'
setData(data)
}
}>
CLICK HERE
</button>
<button onclick={() => {
setData({ // (*)
...data,
information : {
...information,
phone: '5678-5678'
}
})
}
}>
CLICK HERE
</button>
(*) : setData의 인수로 새로운 객체를 넘겨준 것이기 때문에 객체가 변했다고 인식한다...data, ...information: data, information 내부 값을 그대로 가져온다information: {} : 변화가 생긴 information만 다시 넣어준다phone: '5678-5678' : 변한 부분만 재정의해준다