JS深拷貝拷貝的區別?
阿新 • • 發佈:2019-01-03
拷貝拷貝引用,共享記憶體
深拷貝拷貝例項,不共享記憶體
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