js 实现深拷贝的方式
时间: 2023-11-09 10:38:37 浏览: 31
1. 递归拷贝:递归遍历对象的每一个属性,进行拷贝。如果属性是基本类型,直接拷贝;如果是引用类型,递归调用拷贝函数。
2. JSON 序列化/反序列化:使用 JSON.stringify() 将对象序列化成字符串,再使用 JSON.parse() 将字符串反序列化为新的对象。这种方法可以处理大部分数据类型,但是无法处理函数、RegExp 对象等特殊类型,也无法处理循环引用的情况。
3. Object.assign() 方法:使用 Object.assign() 方法将源对象的所有属性复制到目标对象中,如果属性是引用类型,复制的是引用地址。可以通过创建一个空对象作为目标对象,从而实现深拷贝。但是该方法也无法处理循环引用的情况。
4. Lodash 库:Lodash库提供了 _.cloneDeep() 方法,可以实现深拷贝。该方法可以处理循环引用的情况,但是可能会存在性能问题。
相关问题
js 实现深拷贝
实现深拷贝的方法有很多,这里提供两种常见的实现方式:
方法一:使用 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) 创建纯净的对象。
总体来说,实现深拷贝需要考虑很多细节问题,需要针对具体的场景选择不同的实现方式,并进行测试验证。
javascript实现深拷贝
深拷贝是指将一个对象完整地拷贝一份,不受原对象影响,可以通过以下几种方式实现:
1. 递归实现
```javascript
function deepClone(obj) {
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
```
2. JSON序列化实现
```javascript
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
```
但需要注意的是,JSON序列化无法处理函数、正则表达式等特殊类型的数据。