대상의 깊이 있는 복제를 어떻게 실현합니까

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(...)이런 것도 대상인데, 이렇게 쓰면 복제할 수 없잖아..그러나 건물 주인은 깊이 있는 복제의 시험점이 여기에 없다고 생각했다. 아마도 다음과 같다.
  • 원시 데이터 형식의 직접 할당
  • function의 exception
  • 대상의 깊이 클론에서 Array 유형에 대한 판단
  • 복제 함수의 귀속 호출
  • 좋은 웹페이지 즐겨찾기