最简单的深拷贝
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 无法复制函数,正则
2 原型链没了,对象就是object,所属的类没了
3 循环引用的问题,没解决
当然jQ 的 extend函数也可以实现深复制,但是我目前jQ基本不用了
深浅复制想必大家都清楚,这里只做简单介绍
浅复制代码
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
}
浅复制
只复制一层对象的属性,也就是说浅复制是对对象地址的复制,修改其中一个对象的属性,则另一个对象的属性也会随之改变,这就导致people.name和shallowObj.name指向同一块内存地址,
影响
shallowObj.name = 'yqq'
people.name 结果也是'yqq' 而不是原来的'yzs'
深复制代码
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
}
深复制
深复制会递归赋值对象所有层级,也就是说深复制会开辟新的栈,所以2个对象对象不同的地址,修改其中一个对象的属性,不会改变另一个对象的属性
不影响
shallowObj.name = 'yqq'
people.name 结果'yzs'