JS深拷贝

最简单的深拷贝

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' 

你可能感兴趣的:(JS深拷贝)