JavaScript에서는 객체 변수 간의 모든 할당이 주소를 전달합니다. 일부 학생들은 어떤 객체가 객체인지 묻습니다. 예를 드는 것이 더 나을 수도 있습니다.
실제로 딥 카피에서 처리해야 할 주요 개체는 개체 개체가 아닌 개체만 직접적이고 정상적으로 할당하면 됩니다. js 딥 카피 구현에 대한 내 생각은 다음과 같습니다.
객체의 모든 속성을 탐색합니다.
속성이 "객체"인 경우 특별한 처리가 필요합니다.
이 개체가 특별하고 배열인 경우 새 배열을 만들고 배열의 요소를 깊게 복사하세요.
이 개체가 배열이 아닌 개체인 경우 해당 개체에 대해 전체 복사 메서드를 재귀적으로 호출하면 됩니다.
"객체"가 아닌 경우에는 정상적으로 복사하면 됩니다.
다음은 제가 구현한 것입니다.
for (attr in this) {
If (this.hasOwnProperty(attr)) {
If (typeof(this[attr]) === "객체") {
If (this[attr] === null) {
obj[attr] = null;
}
else if (Object.prototype.toString.call(this[attr]) === '[객체 배열]') {
obj[attr] = [];
for (i=0; i
}
} else {
obj[attr] = this[attr].DeepCopy();
}
} 그 밖의 {
obj[attr] = this[attr];
}
}
}
객체 반환;
};
브라우저가 ECMAScript 5를 지원하는 경우 객체 속성의 모든 속성을 심층 복사하려면
을 사용할 수 있습니다.교체
이 메소드를 Object.prototype에 직접 구현하면 모든 객체가 이 메소드를 상속한다는 장점이 있습니다. 단점은 일부 라이브러리가 Object 객체도 다시 작성하므로 때때로 충돌이 발생한다는 것입니다. 이것은 주목할 사항입니다. 구체적인 사용방법은 다음과 같습니다.
위는 Deep Copy에 대한 설명이지만, 오늘은 Deep Copy에 대해 이야기한 만큼, Shallow Copy에 대해서도 간략히 정리해 보겠습니다.
Shallow copy(섀도우 클론): 객체의 기본 유형과 객체 유형만 복사되며, 이는 여전히 원본 참조에 속합니다.
딥 카피(deep clone): 객체의 기본 클래스를 복사할 뿐만 아니라, 원본 객체에 있는 객체도 복사하는 것, 즉 완전히 새로운 객체가 생성됩니다.