实现一个对象深拷贝函数cloneDeep(),要求:(阿里真题,扩展) (1)对象属性可能是函数; (2)不需要拷贝原型链上的属性和方法;
时间: 2023-06-08 07:05:34 浏览: 94
JavaScript 中对象的深拷贝
好的,关于实现一个对象深拷贝函数cloneDeep()的问题,您可以参考下面的代码示例:
```
function isObject(obj) {
return typeof obj === 'object' && obj !== null;
}
function cloneDeep(source) {
if (!isObject(source)) {
return source;
}
// 判断 source 的数据类型
const target = Array.isArray(source) ? [] : {};
// 遍历 source 的每个属性,进行拷贝
for (const key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
const value = source[key];
// 如果属性值是对象或函数,递归调用拷贝函数
if (isObject(value)) {
target[key] = cloneDeep(value);
} else {
target[key] = value;
}
}
}
return target;
}
```
这是一个比较通用的对象深拷贝函数,它能够处理对象属性中的函数,而且不会拷贝原型链上的属性和方法。具体地说,它的逻辑如下:
1. 首先判断传入的 source 参数是否是对象,如果不是对象就直接返回原值。
2. 如果 source 是对象,就根据它的数据类型(数组或对象)创建一个空的目标对象(target)。
3. 然后遍历 source 的每个属性,如果属性值是对象或函数,就递归调用拷贝函数进行拷贝,否则直接拷贝属性值。
4. 最后返回目标对象 target。
需要注意的是,这个函数虽然处理了大部分的情况,但并不能处理所有的情况。特别是在处理带有循环引用的对象时,会出现栈溢出的问题。如果需要处理这种情况,可以考虑使用一些第三方库,比如 lodash 的 cloneDeep 方法。
阅读全文