深拷貝和淺拷貝的區別
淺拷貝:就是簡單的複製,用等號即可完成
let a =
let b = a
這就完成了乙個淺拷貝
但是當修改物件b的時候,我們發現物件a的值也被改變了
b.a = 10
console.log(a.a) => 10
這是因為淺拷貝只複製了指向物件的指標,新舊物件共用同一塊記憶體,修改某乙個物件的同時也會把另乙個都一併修改了
深拷貝:跟淺拷貝最簡單明瞭的區別就是修改拷貝的物件,不會改變源物件
利用object.assign可以對只有一層的物件實現深拷貝,如下:
let a =
let b = object.assign({}, a)
b.b = 100
console.log(a.b) => 2
可以看出來這樣是完全可以做到對只有一層的物件實現深拷貝的
但是如果物件裡面的元素還是物件的話就沒作用了
let a = }
let b = object.assign({}, a)
b.d.a = 100
console.log(a.d.a) => 100
對於這種比較複雜的物件,我們就可以利用遞迴的方式實現真正的物件深拷貝了
function deepclone (sourceobj, targetobj)
if(!sourceobj || typeof sourceobj !== "object" || sourceobj.length === undefined)
if(sourceobj instanceof array) else )
} else }}
return cloneobj
}
簡單的幾行**就可以輕鬆實現物件的深拷貝
簡單的測試**,如下:
let sourceobj = ,
c: },
d: function() ,
e: [1, 2, 3]
}let targetobj = deepclone(sourceobj, {})
targetobj.c.b.a = 9
console.log(sourceobj) => , c: }, d: [function: d], e: [ 1, 2, 3 ] }
console.log(targetobj) => , c: }, d: [function: d], e: [ 1, 2, 3 ] }
另外介紹兩個用來做深拷貝的庫
**jquery**
使用方法:
let targetobj = $.extent(true,{},sourceobj)
**lodash函式庫**
使用方法:
npm install lodash
**es5寫法**
let lodash = require('lodash')
**es6寫法**
import lodash from 'lodash'
let targetoj = lodash.clonedeep(sourceobj)
另一些種:
function deepcopy(obj,newobj) else}}
}var obj = , ]
}var newobj = {};
deepcopy(obj,newobj);
obj.list[0].dec = '邪眸白虎';
console.log(newobj);
console.log(obj);
JS深拷貝遞迴實現
方法1.要提前宣告乙個物件 var a arr 1,2,3 say function null var b 遞迴賦值 function deepcopy a,b js的每個物件constructor指向它的建構函式 deepcopy a item b item else deepcopy a,b 方...
js深轉殖深拷貝
不足之處是不能拷貝函式,但是基本夠用 const deepcopy obj json parse json stringify obj 如果涉及拷貝函式 簡單一點 function copy object for const k,v of object.entries object return o...
js淺拷貝深拷貝
js淺拷貝深拷貝 對於想要複製的物件,如果物件裡面對應的值都是基本資料型別的,可以直接複製 也就是通過淺拷貝複製。如果對應的值有物件那麼淺拷貝是行不通的。會造成資料汙染。下面介紹淺拷貝與深拷貝實現方法。1.淺拷貝 let tem let copy for let key in tem 2.通過obj...