>  기사  >  웹 프론트엔드  >  Javascript Medium 및 Deep Copy에 대한 간략한 토론_기본 지식

Javascript Medium 및 Deep Copy에 대한 간략한 토론_기본 지식

WBOY
WBOY원래의
2016-05-16 16:29:571393검색

JavaScript에서는 객체 변수 간의 모든 할당이 주소를 전달합니다. 일부 학생들은 어떤 객체가 객체인지 묻습니다. 예를 드는 것이 더 나을 수도 있습니다.

코드 복사 코드는 다음과 같습니다.

typeof(true) //"부울"
typeof(1) //"숫자"
typeof("1") //"문자열"
typeof({}) //"객체"
typeof([]) //"객체"
typeof(null) //"객체"
typeof(함수(){}) //"함수"

실제로 딥 카피에서 처리해야 할 주요 개체는 개체 개체가 아닌 개체만 직접적이고 정상적으로 할당하면 됩니다. js 딥 카피 구현에 대한 내 생각은 다음과 같습니다.

객체의 모든 속성을 탐색합니다.
속성이 "객체"인 경우 특별한 처리가 필요합니다.
이 개체가 특별하고 배열인 경우 새 배열을 만들고 배열의 요소를 깊게 복사하세요.
이 개체가 배열이 아닌 개체인 경우 해당 개체에 대해 전체 복사 메서드를 재귀적으로 호출하면 됩니다.
"객체"가 아닌 경우에는 정상적으로 복사하면 됩니다.

다음은 제가 구현한 것입니다.

코드 복사 코드는 다음과 같습니다.

Object.prototype.DeepCopy = 함수 () {
var obj, i;
obj = {};

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               obj[attr].push(this[attr][i].DeepCopy());
          }
         } else {
           obj[attr] = this[attr].DeepCopy();
}
} 그 밖의 {
        obj[attr] = this[attr];
}
}
}
객체 반환;
};

브라우저가 ECMAScript 5를 지원하는 경우 객체 속성의 모든 속성을 심층 복사하려면

을 사용할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));

교체

코드 복사 코드는 다음과 같습니다.

obj[attr] = this[attr];

이 메소드를 Object.prototype에 직접 구현하면 모든 객체가 이 메소드를 상속한다는 장점이 있습니다. 단점은 일부 라이브러리가 Object 객체도 다시 작성하므로 때때로 충돌이 발생한다는 것입니다. 이것은 주목할 사항입니다. 구체적인 사용방법은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

Object.prototype.DeepCopy = 함수 () { ... }
var a = { x:1 };
var b = a;
var c = a.DeepCopy();
a.x = 2;
b.x = 3;
console.log(a.x); //3
console.log(b.x) //3
console.log(c.x) //1

위는 Deep Copy에 대한 설명이지만, 오늘은 Deep Copy에 대해 이야기한 만큼, Shallow Copy에 대해서도 간략히 정리해 보겠습니다.

Shallow copy(섀도우 클론): 객체의 기본 유형과 객체 유형만 복사되며, 이는 여전히 원본 참조에 속합니다.
딥 카피(deep clone): 객체의 기본 클래스를 복사할 뿐만 아니라, 원본 객체에 있는 객체도 복사하는 것, 즉 완전히 새로운 객체가 생성됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.