JavaScript에서는 객체 변수 간의 모든 할당이 주소를 통해 전달됩니다. 어떤 학생들은 어떤 객체 객체가 있는지 물어볼 수 있습니다. 예를 들어 보는 것이 좋습니다.
코드 사본은 다음과 같습니다.
typeof (true) // "부울"
타입 (1) // "숫자"
typeof ( "1") // "String"
typeof ({}) // "object"
typeof ([]) // "Object"
typeof (null) // "object"
typeof (function () {}) // "function"
실제로, 심층 복사를 처리하는 데 필요한 객체는 객체 객체이며, 비 객체 객체는 직접적으로 정상적으로 할당됩니다. JS의 깊은 복제를 구현하려는 나의 생각은 다음과 같습니다.
이 개체의 모든 속성을 반복하고
속성이 "개체"인 경우 특별 처리가 필요합니다.
이 객체 객체가 특수이고 배열 인 경우 새 배열을 만들고 배열의 요소를 깊이 복사하십시오.
이 객체 객체가 비 어류 객체 인 경우 딥 카피 메소드를 재귀 적으로 호출하십시오.
"객체"가 아닌 경우 정상적으로 복사하십시오.
내 구현은 다음과 같습니다.
코드 사본은 다음과 같습니다.
Object.Prototype.deepcopy = function () {
var obj, i;
obj = {};
(이것에 attr) {
if (this.hasownproperty (attr)) {
if (typeof (this [attr]) === "object") {
if (this [attr] === null) {
obj [attr] = null;
}
else if (object.prototype.tostring.call (this [attr]) === '[Object Array]') {
obj [attr] = [];
for (i = 0; i <this [attr] .length; i ++) {
obj [attr] .push (this [attr] [i] .deepcopy ());
}
} 또 다른 {
obj [attr] = this [attr] .deepcopy ();
}
} 또 다른 {
obj [attr] = this [attr];
}
}
}
반환 obj;
};
브라우저가 ECMAScript 5를 지원하는 경우 객체 속성의 모든 기능을 깊이 복사하기 위해이를 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
object.defineProperty (obj, attr, object.getOwrPropertyDescriptor (this, attr));
교체하려면
코드 사본은 다음과 같습니다.
obj [attr] = this [attr];
이 메소드를 Object.Prototype에서 직접 구현하는 장점은 모든 객체가 메소드를 상속한다는 것입니다. 단점은 일부 라이브러리가 객체 객체를 다시 작성하므로 때로는 충돌이 발생한다는 것입니다. 이것은주의를 기울여야합니다. 특정 사용 방법은 다음과 같습니다.
코드 사본은 다음과 같습니다.
Object.Prototype.deepcopy = function () {...}
var a = {x : 1};
var b = a;
var c = a.deepcopy ();
Ax = 2;
BX = 3;
Console.log (AX); // 3
Console.log (BX); // 3
Console.log (CX); // 1
위는 깊은 복제에 대한 설명입니다. 그러나 오늘 우리는 오늘 깊은 복제에 대해 이야기했기 때문에 그에 따라 얕은 복제를 원합니다. 그들 사이의 유사점과 차이점을 간단히 요약하겠습니다.
얕은 사본 (Shadow Cloning) : 객체의 기본 유형 만 복사하고 객체 유형은 여전히 원래 참조에 속합니다.
딥 카피 (Deep Cloning) : 객체의 기본 클래스를 복사하지 않고 원래 객체의 객체를 복사합니다. 즉, 새로운 객체에 의해 완전히 생성됩니다.