关于js实现对象深拷贝的方式,首先js中的对象如同java中的复杂数据类型,普通的赋值运算符进行的赋值进行的只是栈内存中的关于堆内存中对象的引用。如何实现对象的深拷贝,这里可以给出三种解决方案。
第一种,使用JSON.parse以及JSON.stringify。弊端如下:
1.如果对象中存在循环引用的情况也无法正确实现深拷贝
2.如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
3.如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
let target = JSON.parse(JSON.stringify(a))
第二种:利用递归的方式
function deepCopy(s) {
const target = {}
for (let k in s) {
if (typeof s[k] == 'object') {
d[k] = deepCopy(s[k])
} else {
d[k] = s[k]
}
}
return target
}
console.log(deepCopy(a));
第三种方式:利用es6中Object.assign的方法将源对象的所有可枚举属性复制到目标对象中。
let target = {}
Object.assign(target,a)
有关Object.assign方法的说明:它至少需要两个参数,第一个参数是目标对象,第二个是源对象。如果两个参数任意一个不是对象,则会报错。同时,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性覆盖前面的属性。