最簡(jiǎn)單的深拷貝
JSON.parse(JSON.stringify)
第三方依賴
https://www.npmjs.com/package/clone-deep
栗子
let people = {name:'yzs',age:21,sex:true}
let obj = JSON.parse(JSON.stringify(test))
obj.name = 'yqq'
people.name? 輸出 'yzs'
哈哈是不是 so easy? But 也有弊端
1 無法復(fù)制函數(shù),正則
2 原型鏈沒了,對(duì)象就是object,所屬的類沒了
3 循環(huán)引用的問題,沒解決
當(dāng)然jQ 的 extend函數(shù)也可以實(shí)現(xiàn)深復(fù)制,但是我目前jQ基本不用了
深淺復(fù)制想必大家都清楚,這里只做簡(jiǎn)單介紹
淺復(fù)制代碼
let people = {name:'yzs', age:28}
let shallowObj =shallowCopy(people)
function shallowCopy(obj){
var temp = {}
for (const prop in obj){
if(obj.hasOwnProperty(prop)){
temp[prop] = obj[prop]
}
}
return temp
}
淺復(fù)制
只復(fù)制一層對(duì)象的屬性,也就是說淺復(fù)制是對(duì)對(duì)象地址的復(fù)制,修改其中一個(gè)對(duì)象的屬性,則另一個(gè)對(duì)象的屬性也會(huì)隨之改變,這就導(dǎo)致people.name和shallowObj.name指向同一塊內(nèi)存地址,
影響
shallowObj.name = 'yqq'
people.name? ?結(jié)果也是'yqq' 而不是原來的'yzs'
深復(fù)制代碼
let people = {name:'yzs', age:28}
let shallowObj =deepCopy(people)
function deepCopy(oldObj,newObj){
var newObj = newObj || {}
for (const i in oldObj){
if(typeof oldObj[i] ==='object'){
if(oldObj[i] ===null){
newObj[i] =null
? ? ? ? ? ? }else {
if(oldObj[i].constructor === Array){
newObj[i] = []
}else {
newObj[i] = {}
}
}
deepCopy(oldObj[i],newObj[i])
}else{
newObj[i] = oldObj[i]
}
}
return newObj
}
深復(fù)制
深復(fù)制會(huì)遞歸賦值對(duì)象所有層級(jí),也就是說深復(fù)制會(huì)開辟新的棧,所以2個(gè)對(duì)象對(duì)象不同的地址,修改其中一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性
不影響
shallowObj.name = 'yqq'
people.name? ?結(jié)果'yzs'?