대상의 깊이 있는 복제를 어떻게 실현합니까
4833 단어 대상
대상의 복제를 이해하려면 먼저 js의 대상의 구성을 알아야 한다.js에서 모든 실례는 대상이고 구체적으로 원본 및 작성 유형로 나뉜다.원시 유형의 대상은number,string,boolean 등을 가리키며, 합성 유형의 대상은array,object 및function을 가리킨다.
또'심도 복제'라는 단어를 방금 들었을 수도 있다. 간단하게 말하면 변수 a가 있다. a의 값은 대상(기본 데이터 형식 포함)이다. 이제 변수 b를 만들어서 a와 같은 방법과 속성을 가지게 해야 한다. 그러나 a와 b 사이에는 서로 영향을 주지 않는다. 즉, a의 값의 변화는 b의 변화에 영향을 주지 않는다.
직접 값을 부여하는 것이 어떻습니까?
var a = 1;
var b = a;
a = 10;
console.log(b); // 1
var a = 'hello';
var b = a;
a = 'world';
console.log(b); // hello
var a = true;
var b = a;
a = false;
console.log(b); // true
일부 JavaScript의 원본 데이터 유형은 클론이 직접 값을 지정하는 경우 검증됩니다.
function의 깊이 복제에 관하여: 일부 자료를 찾아보았는데, function의 깊이 복제는 원시 데이터 형식의 깊이 복제와 같다.
var a = function() {console.log(1);};
var b = a;
a = function() {console.log(2);};
b(); // 1
원래 나도 이렇게 생각했는데, 글 밑에 평론이 나올 때까지.생각한 후에 나는 function은 일반적인 대상과 같다고 생각한다. 단지 우리가 평상시 응용에서 전체적인 재할당 값에 익숙해져서 깊이 있는 복제에서의 표현은 원시 유형과 일치한다.
var a = function() {console.log(1);};
a.tmp = 10;
var b = a;
a.tmp = 20;
console.log(b.tmp); // 20
따라서 function 유형의 깊이 있는 복제에 대해 직접 값을 부여하는 것이 가장 좋은 방법은 아닌 것 같다. (비록 실제 응용은 충분하지만.)그러면 어떻게 복제합니까?글 아래의 평론을 참고하여 하나의 해결 방안을 잃지 않을 수 있다.
그런데 상대는요?
var a = [0, 1, 2, 3];
var b = a;
a.push(4);
console.log(b); // [0, 1, 2, 3, 4]
분명히 예상과 맞지 않는데, 왜 이러지?원시 데이터 형식은 대상의 실제 데이터를 저장하고 대상 유형은 대상의 인용 주소를 저장하기 때문이다.위의 예는 a와 b 대상이 같은 주소를 인용한 것이다. a를 바꾸든 b를 바꾸든 사실 근본적인 조작은 똑같다. 모두 그 공간 주소의 값에 대한 변화이다.
그래서 우리는 기본적인 대상에게 =부치만 사용할 수 없다는 것을 알게 되었다. 생각한 후에 다음과 같은 코드를 썼다.
function deepClone(obj) {
var o = obj instanceof Array ? [] : {};
for(var k in obj)
o[k] = typeof obj[k] === Object ? deepClone(obj[k]) : obj[k];
return o;
}
var a = [[1, 2, 3], [4, 5, 6, 7]];
var b = deepClone(a);
console.log(b);
일반적인 대상(Array 포함)의 깊이 있는 복제를 해결할 수 있을 것 같은데, 혹시 여기에 의문이 있을지도 몰라요. new String(...)이런 것도 대상인데, 이렇게 쓰면 복제할 수 없잖아..그러나 건물 주인은 깊이 있는 복제의 시험점이 여기에 없다고 생각했다. 아마도 다음과 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
List 컬렉션 객체에서 서로 다른 속성 크기로 정렬된 인스턴스인스턴스는 다음과 같습니다. 테스트: 출력 결과는 다음과 같습니다. 두 번째 방법은 컬렉션에 따라.sort 재부팅 방법(예: 마스터 클래스에서 이렇게 작성하면 됩니다. 출력 결과는 다음과 같습니다. 전자의 코드 구조...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.