深拷贝和浅拷贝
浅拷贝
浅拷贝:如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。即浅拷贝是拷贝一层,深层次的引用类型则共享内存地址。常用的方法有:object.assgin,扩展运算符等等
ts
const a={count:1,deep:{count:2}}
const b = Object.assign({}, a);
//实现一个浅拷贝
function shallowClone(obj) {
const newObj ={}
for(item in obj)
{
if(obj.hasOwnProperty(item))
{
newObj[item]=obj[item]
}
}
return newObj
}深拷贝
深拷贝:开辟一个新的栈,两个对象的属性完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
ts
function deepClone(obj, map = new Map()) {
if (obj === null) return obj // 如果是null或者undefined我就不进行拷贝操作
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
if (typeof obj !== 'object') return obj
if (map.get(obj)) {
return map.get(obj);
}
let res = {}
if (obj instanceof Array || Object.prototype.toString(obj) === "[object Array]") {
res = []
}
//防止循环引用
map.set(obj, res)
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
res[key] = deepClone(obj[key], map)
}
}
return result
}
指南