심도 카피 개념 차이 및 심도 카피 코드 실현

2494 단어 js 방법
심도 있는 복사 문제는 사실 기본 유형과 인용 유형의 데이터 복사의 문제이다.기본 형식의 데이터 크기가 고정되어 있기 때문에 그는 창고 메모리에 저장한다.인용 형식의 데이터 크기가 고정되지 않기 때문에 더미 메모리에 저장되며, 단일 인용 형식은 창고 메모리에 더미 메모리를 가리키는 바늘만 저장됩니다.
얕은 복사: 얕은 복사의 경우 기본 유형을 복사하면 부치와 같이 그 자체를 직접 복사한다.그러나 인용 유형을 복사하면 한 층만 복사되고 원 대상이 바뀌면 복사 대상도 바뀐다.
딥 카피: 딥 카피는 여러 층을 카피하고 끼워 넣은 대상도 카피한다. 카피를 저장할 새로운 메모리 주소를 개척하는 것과 같다.

딥 카피 구현:


첫 번째: ES6의 Object.assign () 방법
대상이 단지 한 층만 있는 것에 대해서는 진정한 깊은 복사를 실현할 수 없다.대상이 여러 층으로 되어 있어 이 방법을 사용할 수 없습니다.
Object.ssign({},obj1)은 먼저 빈 대상을 만들고 그 다음에 obj1의 모든 속성을 복사한다는 뜻이기 때문에 obj2obj1와 똑같이 생겨서 이때 수정obj2.b해도 영향을 주지 않는다obj1。
var obj1 = {name:'lily'};
    var obj2 = Object.assign({},obj1);
    obj2.name = 'bob';
    console.log(obj1.name); //lily
    console.log(obj2.name); //bob

두 번째: 대상을 문자열로 변환해서 돌아오기JSON.stringify로 대상을 문자열로 바꾸고 JSON.parse로 문자열을 새로운 대상으로 바꿉니다.
 var obj = {
        a:'hello',
        b:{
            name:'lily',
            age:21
        },
        c:[1,2,3]
    };
    var obj1 = JSON.parse(JSON.stringify(obj));
    obj1.a = 'world';
    obj1.b = {
        name:'bob',
        age:15
    };
    obj1.c = [6,7,8];
    console.log(obj.a);
    console.log(obj.b);
    console.log(obj.c);
    console.log(obj1.a);
    console.log(obj1.b);
    console.log(obj1.c);

이때obj1의 모든 속성의 값을 바꿔도obj는 영향을 받지 않습니다.그러나 이런 방법은 함수function에 대해서는 무효다.
세 번째: 귀속 방법은 심층 복사를 실현한다.
지식 포인트:
1:3원 표현식:
표현식(expr1)?(expr2) : (expr3)
expr1에서 TRUE를 구할 때의 값은 expr2이고, expr1에서 FALSE를 구할 때의 값은 expr3이다.
2:hasOwnProperty(): 대상이 자신의 속성이 있는지 판단하는 데 사용
function deepClone(obj){
        // , 
        var newObj = Array.isArray(obj) ? [] : {};
        // obj 
        // 
        if(typeof obj != 'object'){ // , obj, 
            return newObj = obj;
        }
        // 
        if(obj instanceof Array){ // 
            for(var i=0;i

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기