>  Q&A  >  본문

javascript - 참조 객체 할당, 깊은 복사본과 얕은 복사본 jquery.extend

한 참조 유형이 다른 참조 유형에 할당되면 동일한 주소를 가리키기만 하고 작업이 서로 영향을 미칩니다.
Deep Copy는 공간과 이전 개체 또는 배열이 영향을 받지 않도록 공간을 재할당하는 것입니다.
얕은 사본은 참조 유형 지정과 동일합니다.

으아아아

jquery 소스 코드에 재귀가 필요한 것을 봤습니다.
하지만 이해가 안 돼요. 상호 영향과 무슨 관련이 있는지, 아니면 위의 개념에 대한 저의 이해가 잘못되었습니다

PHPzPHPz2734일 전970

모든 응답(2)나는 대답할 것이다

  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:35:54

    얕은 사본

    객체의 최상위 키만(해당 참조에) 순회하고 재할당합니다. 예:

    으아악 으아악

    이 과정에서 모든 최상위 요소는 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의 첫 번째 요소로 병합됩니다. 이 병합은 요소의 인덱스 번호를 키로 기준으로 배열이 작동하기 때문입니다. 따라서 확장을 사용하여 배열을 병합할 수는 없지만 병합 또는 연결 사용을 고려해야 합니다.

    회신하다
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:54

    이름 중복일 뿐 딥카피/얕은카피와는 관련이 없습니다. 재귀 복사라고 부르는 것이 더 적절합니다.

    회신하다
    0
  • 취소회신하다