심층 복제의 실현

2279 단어 전단 면접 문제

얕은 복사와 깊은 복사


얕은 복사: 복사된 값은 인용이지 실제 값이 아니다. 깊이 복사된 값은 인용이 아니라 실제 값이다.복제된 요소가 대상이라면, 깊이 복사는 대상을 다시 만들고, 대상의 값을 하나씩 복제하는 것이지, 그 대상의 인용 값만 얻는 것이 아니다.

왜 깊이를 나누어 복사해야 합니까


분명히 얕은 복사는 매우 큰 문제를 가져올 것이다.즉, 만약 내가 복제한 값이 인용 주소라면, 내가 변수를 통해 이 대상을 수정하면 모든 대상의 인용이 달라질 것이다.

slice/concat 모두 얕은 복사입니다


하나의 예
var a = [1,2,{name: 'amy'}];
var b = a.concat([]);
b[2].name = 'sam';
console.log(a[2].name);//  ‘sam’

함수 매개 변수의 값별 전달


《javascript 고급 프로그램 설계》라는 책에서 언급한 함수의 매개 변수 전달은 모두 값에 따라 전달되지만 인용 형식의 데이터를 전송하고 함수 안에서 수정하면 실제 참조의 변화를 초래할 수 있음을 발견할 수 있다.이것이 바로 인용 유형의 비밀이다.js에서는 인용 형식을 무더기에 분배합니다. 우리가 성명한 변수는 이 대상을 저장하는 것이 아니라 대상의 인용을 저장하는 것입니다.따라서 매개 변수를 전달할 때도 값에 따라 전달된다.그러나 이 값은 인용이기 때문에 같은 인용을 수정하면 대상의 직접적인 변화를 초래할 수 있다.

딥 카피 구현


그렇다면 우리는 어떻게 심층 복사를 실현합니까?
function deepClone(obj) {
    var newObj = obj instanceof Array ? [] : {};
    //obj , obj
    if(typeof obj !== 'object') {
        return obj;
    } else {
    //obj , 
        for(var i in obj) {
            newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]):obj[i]; 
        }
    }
    return newObj;
}

좋은 웹페이지 즐겨찾기