js 实现深拷贝
时间: 2023-07-12 12:09:25 浏览: 104
实现深拷贝的方法有很多,这里提供两种常见的实现方式:
方法一:使用 JSON 序列化和反序列化
```javascript
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
```
该方法的优点是实现简单,代码量少,但是有一些限制:
- 无法拷贝函数、正则表达式等特殊对象;
- 会抛弃对象的 constructor,所有的构造函数会指向 Object;
- 对象有循环引用时会报错。
方法二:递归拷贝
```javascript
function deepClone(obj) {
// 判断类型
function getType(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
let newObj = getType(obj) === "Array" ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] =
typeof obj[key] === "object" && obj[key] !== null
? deepClone(obj[key])
: obj[key];
}
}
return newObj;
}
```
该方法可以较好地解决方法一的限制,但是需要注意以下问题:
- 对象有循环引用时会爆栈,需要加上判断;
- 无法拷贝特殊对象,需要自行实现;
- 对象的原型链上的属性无法拷贝,需要用 Object.create(null) 创建纯净的对象。
总体来说,实现深拷贝需要考虑很多细节问题,需要针对具体的场景选择不同的实现方式,并进行测试验证。
阅读全文