JavaScript实现深拷贝
1. JSON.parse(JSON.stringify())
- 对于简单的对象或数组,使用
JSON.parse(JSON.stringify(obj)
即可实现深拷贝,但如果被拷贝对象中存在函数或正则表达式,深拷贝就无法完成了。 - JSON.parse() 可以将字符串解析为对象,而 JSON.stringify() 会将对象转化为json格式的字符串,但是这两个过程都存在着一些问题
- 执行下面的代码
let obj = { a: 1, o: { username: '尼古拉斯·赵四' }, f: function(){}, reg: /\d+/, }; console.log('stringify', JSON.stringify(obj)) console.log('parse', JSON.parse(JSON.stringify(obj)))
- 可以看到在执行
JSON.stringify()
后,obj中的函数属性直接没有了,而正则表达式则变成了空对象
- 可以看到在执行
2. 递归实现深拷贝
function deepCopy(obj) {
// 如果是null或者undefined就不拷贝
if (obj === null) return obj;
// 如果是普通的值或函数就直接返回
if (typeof obj !== "object") return obj;
// 如果是正则表达式就直接返回
if (obj instanceof RegExp) return new RegExp(obj);
// 对对象进行递归深拷贝
let cloneObj = new obj.constructor();
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloneObj[key] = deepCopy(obj[key]);
}
}
return cloneObj;
}