在js中怎么实现深拷贝怎么只拷贝一次?
时间: 2024-09-23 20:10:32 浏览: 29
在JavaScript中,深拷贝是指创建一个新的对象,并复制原对象的所有属性以及它们对应的值,包括嵌套的对象和数组。如果直接使用`JSON.parse()`和`JSON.stringify()`方法,虽然可以实现浅拷贝,但对复杂结构(如循环引用、函数等)并不适用。一个常用的深拷贝库是`lodash`的`_.cloneDeep()`。
```javascript
const _ = require('lodash'); // 如果你在项目中已安装lodash
function deepCopy(obj) {
return _.cloneDeep(obj);
}
let obj1 = { a: 1, b: [2, 3], c: { d: 4 } };
let copiedObj = deepCopy(obj1);
// copiedObj现在是一个独立于obj1的新对象,修改copiedObj不会影响obj1
```
对于递归深拷贝,需要自定义函数来处理可能出现的循环引用:
```javascript
function deepClone(obj, hash = new WeakMap()) {
if (hash.has(obj)) return hash.get(obj); // 检查是否有缓存,如果有则返回
if (typeof obj !== 'object' || obj === null) return obj; // 非对象或null直接返回
const cloned = Array.isArray(obj) ? [] : {}; // 创建新数组或对象
hash.set(obj, cloned); // 将原始对象添加到缓存中
for (let key in obj) {
cloned[key] = deepClone(obj[key], hash); // 递归处理每个属性
}
return cloned;
}
```
阅读全文