用JavaScript写一个深拷贝方法,包含函数、正则等类型的属性
时间: 2024-02-24 13:58:33 浏览: 119
js代码-(3)深拷贝:增加函数的深拷贝
以下是一个使用递归实现的 JavaScript 深拷贝方法,支持复杂数据类型的拷贝:
```
function deepClone(obj, clonedObjects = new WeakMap()) {
if (obj === null || typeof obj !== "object") {
return obj;
}
if (clonedObjects.has(obj)) {
return clonedObjects.get(obj);
}
var clone = Array.isArray(obj) ? [] : {};
clonedObjects.set(obj, clone);
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var value = obj[key];
if (typeof value === "function") {
clone[key] = eval("(" + value.toString() + ")");
} else if (value instanceof RegExp) {
clone[key] = new RegExp(value);
} else if (value instanceof Date) {
clone[key] = new Date(value);
} else {
clone[key] = deepClone(value, clonedObjects);
}
}
}
return clone;
}
```
使用示例:
```
var obj1 = { a: 1, b: { c: 2 }, d: function () { console.log("hello world"); } };
var obj2 = deepClone(obj1);
obj2.b.c = 3;
obj2.d(); // 输出 "hello world"
console.log(obj1); // { a: 1, b: { c: 2 }, d: [Function: d] }
console.log(obj2); // { a: 1, b: { c: 3 }, d: [Function: d] }
```
注意:
- 这个方法依赖于 ECMAScript 6 中的 `WeakMap` 数据结构,如果在老版本浏览器中使用可能会出现兼容性问题。
- 如果对象中存在循环引用,则需要使用 `clonedObjects` 参数来记录已经拷贝过的对象,避免出现无限递归的情况。
阅读全文