首先了解什么是深浅拷贝
浅拷贝:
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象
深拷贝:
深拷贝就是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
借用colid大佬的图片
\
赋值与深浅拷贝的区别
在这里应用浪里行舟大佬的图片\
浅拷贝的表现形式
1.Object.assign(target,source)
2.es6扩展运算符
eg:
const obj={ a:1, name:'sariy' }
const newObj=...obj
3.Array.prototype.concat()
4.Array.prototype.slice()
深拷贝表现形式
1.JSON.stringfy能实现80%的深拷贝
处理一下集几种情况不能使用这种方式
1.如果obj里面存在时间对象,拷贝完会变为字符串
2.如果obj里有RegExp、Error对象,拷贝完变成空对象
3.如果obj里有函数,undefined,拷贝完属性会丢失
4.如果obj里有NaN、Infinity和-Infinity,拷贝会变成null
5.如果obj中的对象是有构造函数生成的,拷贝后,会丢弃对象的constructor
6.如果对象中存在循环引用的情况也无法正确实现深拷贝
2.深拷贝实现
` function deepClone(obj){
if(!obj || typeof obj ==='object') return
let result= Array.isArray(obj)?[]:{}
for(let i in obj){
if(obj.hasOwnproperty(i)){
result[i]=obj[i]==="object"?deepClone(obj[i]):obj[i]
}
}
return result
} `
3.下载lodash工具库 使用_lodash.cloneDeep()方法实现深拷贝
有不足之处望各位指出,做前端工匠,一起见证成长!