淺拷貝
- 以賦值的形式拷貝引用對(duì)象。仍指向同一個(gè)地址。基本數(shù)據(jù)類型拷貝后兩個(gè)變量互不干擾啦吧;引用數(shù)據(jù)類型在淺拷貝的過程中因僅改變了引用的指針,所以修改原對(duì)象時(shí)拙寡,賦值對(duì)象也會(huì)有影響
- 實(shí)現(xiàn)方法
- ES6的新函數(shù):Object.assign()
Object.assign(target, ...sources)
// target目標(biāo)對(duì)象授滓; sources:任意多個(gè)源對(duì)象
let a = { age: 1 }
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1
- 展開運(yùn)算符 ...
let a = { age: 2 }
let b = { ...a }
a.age = 3
console.log(b.age) // 2
深拷貝
- JSON.parse(JSON.stringify(object)) 性能最快
存在的問題:當(dāng)拷貝具有循環(huán)引用對(duì)象的時(shí)候會(huì)報(bào)錯(cuò),當(dāng)值為序列化函數(shù)肆糕,undefined般堆,symbol時(shí)不能拷貝。
- 遞歸深拷貝
function deepClone (obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof(obj) === 'object'){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判斷子項(xiàng)是否為對(duì)象诚啃,如果也是對(duì)象則遞歸
if(obj[key]&& typeof[key] === 'object'){
objClone[key] = deepClone(obj[key])
}else{
objClone[key] = obj[key]
}
}
}
}
return objClone
}