JS 객체의 참조, 객체의 복사본

1742 단어
카탈로그
  • 1. 장면
  • 2, 얕은 복사
  • 3, 깊이 복사
  • 장면


    기본 형식과null을 제외하고 대상 사이의 값은 주소를 같은 것으로 가리키는 것이지 진정한 의미의 복사가 아니다
    한 대상을 다른 대상에게 값을 부여하다.
    var a = [1,2,3];
    var b = a;
    b.push(4); // b 4
    alert(a); // a [1,2,3,4]  

    사용자 정의 객체
    var obj = {a:10};
    var obj2 = obj;
    obj2.a = 20; // obj2.a ,
    alert(obj.a); // 20,obj a   

    이것은 대상 유형이 직접 값을 부여하기 때문에 인용을 같은 주소로 가리키기 때문에 obj를 수정하면 obj2도 수정될 수 있다

    2. 얕은 복사


    그래서 우리는 하나의 함수를 봉하여 대상을 복사하고 for in 순환을 통해 기본 유형을 얻으며 모든 기본 유형을 부여해야만 진정한 의미에서 대상을 복제할 수 있다
    var obj = {a:10};
    function copy(obj){
        var newobj = {};
        for ( var attr in obj) {
            newobj[attr] = obj[attr];
        }
        return newobj;
    }
    var obj2 = copy(obj);
    obj2.a = 20;
    alert(obj.a); //10  

    이렇게 하면 대상의 가치 부여 문제를 해결할 수 있다.

    3. 심층 복사


    그러나 여기에 위험이 존재한다. 만약에 obj에서 a의 값이 10이 아니라 하나의 대상이라면 forin에서 a라는 대상의 인용 값을 새로운 대상으로 하고 대상의 인용 문제를 초래할 수 있다.
    var obj = {a:{b:10}};
    function copy(obj){
        var newobj = {};
        for ( var attr in obj) {
            newobj[attr] = obj[attr];
        }
        return newobj;
    }
    var obj2 = copy(obj);
    obj2.a.b = 20;
    alert(obj.a.b); //20  

    따라서 이copy대상은 1층만 복사하기 때문에 심층의 대상을 복사할 수 없습니다. 이copy는 얕은 복사이기 때문에 우리는 귀속을 통해 심층의 대상을 복사해야 합니다.copy를 귀속으로 바꾸면 됩니다
    var obj = {a:{b:10}};
    function deepCopy(obj){
        if(typeof obj != 'object'){
            return obj;
        }
        var newobj = {};
        for ( var attr in obj) {
            newobj[attr] = deepCopy(obj[attr]);
        }
        return newobj;
    }
    var obj2 = deepCopy(obj);
    obj2.a.b = 20;
    alert(obj.a.b); //10  

    전재 대상:https://www.cnblogs.com/linhp/p/6085826.html

    좋은 웹페이지 즐겨찾기