이 과정에서 모든 최상위 요소는 b, 즉 b.x, b.y, b.z에서 꺼내지고 a의 해당 키에 하나씩 할당되므로 결국 a는 새로운 a.x, a.y, a.z를 갖게 됩니다. , 동시에 a.o도 a에 남아 있으면 a.x === b.x, a.y === b.y, a.z === b.z입니다. 왜냐하면 모두 동일한 객체를 가리키는 참조이기 때문입니다. 참조이므로 a.x.name = 'x3'과 같이 a.x를 연산하면 b.x.name도 'x3'이 됩니다.
딥 카피
Deep Copy는 개체 요소의 마지막 레이어까지 깊숙이 들어가서 참조하는 대신 다시 할당합니다. 위의 a와 b를 예로 들어 다음을 실행합니다.
으아악
b 내부를 탐색하고 각 노드의 값을 a에 해당하는 노드(정확히 동일)와 비교합니다. 서로 다른 경우 a에 대한 저장 공간을 열고 a가 존재하지 않으면 해당 노드에 값을 할당합니다. , 이 노드는 생성 후 값을 할당하는 데 사용됩니다. a의 첫 번째 수준 자식 노드와 b의 첫 번째 수준 사이에는 동등성이 없으며 ==도 성립되지 않습니다.
딥 카피 후 a의 원래 노드 중 일부는 유지되고 b의 과거 노드는 덮어쓰거나 추가되지만 b와의 참조 관계는 없으므로 a의 노드를 수정해도 b에는 영향을 미치지 않습니다. 이는 일부 데이터를 처리할 때 매우 유용합니다. 원본 데이터에 영향을 주지 않기 위해서는 데이터를 처리하기 전에 전체 복사본을 만드는 것이 필요합니다.
전체 복사 중에는 배열의 인덱스 번호가 키 이름으로 처리되므로 원본 데이터에 배열 요소가 추가되지 않고 수정됩니다. 예:
으아악
다음을 받게 됩니다:
으아악
b의 첫 번째 프리미티브는 a의 첫 번째 요소로 병합됩니다. 이 병합은 요소의 인덱스 번호를 키로 기준으로 배열이 작동하기 때문입니다. 따라서 확장을 사용하여 배열을 병합할 수는 없지만 병합 또는 연결 사용을 고려해야 합니다.
얕은 사본
객체의 최상위 키만(해당 참조에) 순회하고 재할당합니다. 예:
으아악 으아악이 과정에서 모든 최상위 요소는 b, 즉 b.x, b.y, b.z에서 꺼내지고 a의 해당 키에 하나씩 할당되므로 결국 a는 새로운 a.x, a.y, a.z를 갖게 됩니다. , 동시에 a.o도 a에 남아 있으면 a.x === b.x, a.y === b.y, a.z === b.z입니다. 왜냐하면 모두 동일한 객체를 가리키는 참조이기 때문입니다. 참조이므로 a.x.name = 'x3'과 같이 a.x를 연산하면 b.x.name도 'x3'이 됩니다.
딥 카피
Deep Copy는 개체 요소의 마지막 레이어까지 깊숙이 들어가서 참조하는 대신 다시 할당합니다. 위의 a와 b를 예로 들어 다음을 실행합니다.
으아악b 내부를 탐색하고 각 노드의 값을 a에 해당하는 노드(정확히 동일)와 비교합니다. 서로 다른 경우 a에 대한 저장 공간을 열고 a가 존재하지 않으면 해당 노드에 값을 할당합니다. , 이 노드는 생성 후 값을 할당하는 데 사용됩니다. a의 첫 번째 수준 자식 노드와 b의 첫 번째 수준 사이에는 동등성이 없으며 ==도 성립되지 않습니다.
딥 카피 후 a의 원래 노드 중 일부는 유지되고 b의 과거 노드는 덮어쓰거나 추가되지만 b와의 참조 관계는 없으므로 a의 노드를 수정해도 b에는 영향을 미치지 않습니다. 이는 일부 데이터를 처리할 때 매우 유용합니다. 원본 데이터에 영향을 주지 않기 위해서는 데이터를 처리하기 전에 전체 복사본을 만드는 것이 필요합니다.
전체 복사 중에는 배열의 인덱스 번호가 키 이름으로 처리되므로 원본 데이터에 배열 요소가 추가되지 않고 수정됩니다. 예:
으아악다음을 받게 됩니다:
으아악b의 첫 번째 프리미티브는 a의 첫 번째 요소로 병합됩니다. 이 병합은 요소의 인덱스 번호를 키로 기준으로 배열이 작동하기 때문입니다. 따라서 확장을 사용하여 배열을 병합할 수는 없지만 병합 또는 연결 사용을 고려해야 합니다.
이름 중복일 뿐 딥카피/얕은카피와는 관련이 없습니다. 재귀 복사라고 부르는 것이 더 적절합니다.