쉽게 말하자면, 얕은 복사는 주소값을 복사하는 것이고 깊은 복사는 값 자체를 복사해오는 것이다.
객체는 참조 자료형으로 값 자체를 담고 있는 게 아니라 값이 있는 주소를 담고 있다.
그래서 like2를 like에 복사한 후, like2의 food를 변경한 거지만 사실은 그 주소로 찾아가 carrot을 apple로 바꾼 것이기 때문에
같은 주소를 공유하는 like, like2 둘 다 apple이 된 것이다!!!
(박스에 당근이 담겨있는 곳의 주소가 들어있다. 그리고 그 박스를 두 개 만들었으니 당근은 여전히 하나고 주소를 담는 박스만 복사된 것이다. )
C++ 공부할 땐... string을 복사할 때 많은 문제가 있었다. 다른 건 원시자료형인데 string이 참조자료형이었기 때문이다.
자바스크립트에서 string은 그렇지 않으니 괜찮다.(자바스크립트에선 원시 자료형이다.)
하지만 토끼는 당근 하나, 사과 하나를 먹고 싶다! 전부 사과로 바꾸고 싶은 것이 아니다.
그러면 주소를 복사하는 게 아니라 값 자체를 가져오면 된다.
let like2 = {...like}; 의 뜻은 새로운 객체를 만들고 그 안에 like의 내용을 스프레드로 뿌려서 할당한다는 것이다.
그래서 like2는 like와 완전 별도의 객체가 된다. 그래서 이때는 각각의 주소값이 다르고 값도 따로 있기 때문에 like2의 당근만이 사과로 변경된 것이다! 이걸 깊은 복사라고 한다. 박스만 복사한 게 아니라 새로운 박스에 당근을 복사해서 담고, 그 당근을 사과로 바꾼 것이다.
'프론트엔드✏️' 카테고리의 다른 글
Javascript와 Node.js, JS V8 Engine (0) | 2022.07.01 |
---|---|
==(동등 연산자), ===(일치 연산자)의 차이점 (0) | 2022.07.01 |
나 보고 있는거야?!?!?!! observable/promise. Hot&Coooool (0) | 2022.07.01 |
*-커비 프로젝트-* MBTI와 로스트아크 캐릭터! (0) | 2022.06.12 |
*-커비 프로젝트-* 가 무색하게 커비는 의미없어지고 있어 (0) | 2022.06.09 |