1. 程式人生 > >JS深拷貝拷貝的區別?

JS深拷貝拷貝的區別?

  • 拷貝拷貝引用,共享記憶體
  • 深拷貝拷貝例項,不共享記憶體
  1. 淺拷貝:當一個物件拷貝另一個物件的資料時,只要一個物件的資料發生改變時,另一個物件的資料也會發生改變,因為淺拷貝拷貝的是引用的地址 實現方式:   ES6 Object.assign()與擴充套件運算子...,兩者都是隻有是多層時才是淺拷貝,如果是一層還是深拷貝 引數1:空物件 引數2:需要拷貝的物件 簡單的賦值   3. 深拷貝:當一個物件拷貝另一個物件資料時,其中一個物件的資料發生改變時,不會影響另一個物件資料的改變 實現方法:
$.extend(),除了可以給jQuery物件新增 JSON.stringify()=>JSON.parse() slice, concat
for遍歷,將值存在另一個變數中(當物件巢狀多層無能為力) slice和concat這兩個方法,僅適用於對不包含引用物件的一維陣列的深拷貝
  •   淺拷貝(shallow copy):只複製指向某個物件的指標,而不復制物件本身,新舊物件共享一塊記憶體;
  •   深拷貝(deep copy):複製並建立一個一摸一樣的物件,不共享記憶體,修改新物件,舊物件保持不變。
var a = 25;
var b = a;
b = 10;
console.log(a);//25
console.log(b);//10

//淺拷貝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = obj1;
obj2.b = 40;
console.log(obj1);// { a: 10, b: 40, c: 30 } 
console.log(obj2);// { a: 10, b: 40, c: 30 }

//深拷貝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c };
obj2.b = 40;
console.log(obj1);// { a: 10, b: 20, c: 30 }
console.log(obj2);// { a: 10, b: 40, c: 30 }

  

 

深拷貝是指複製物件的所有層級,實現方法 (1)通過遞迴實現
    deepCopy(o) {
        if (o instanceof Array) {
            let n = [];
            for (let i = 0; i < o.length; ++i) {
                n[i] = deepCopy(o[i]);
            }
            return n;
        } else if (o instanceof Object) {
            let n = {}
            for (let i in o) {
                n[i] = deepCopy(o[i]);
            }
            return n;
        } else {
            return o;
        }
    }
( 2) 通過JSON解析實現
    //把一個物件轉成json字串在轉成json物件
    JSON.parse(JSON.stringify(o))

淺拷貝的實現

var json1 = {"a":"name","arr1":[1,2,3]}
function copy(obj1) {
    var obj2 = {};
    for (var i in obj1) {
      obj2[i] = obj1[i];
    }
    return obj2;
}
var json2 = copy(json1);
json1.arr1.push(4);
alert(json1.arr1); //1234
alert(json2.arr1) //1234