要求:
(1)对象属性可能是函数;
(2)不需要拷贝原型链上的属性和方法;
直接上代码
//创建测试对象
let obj = {
a: [1, { ss: "ss" }, [3], 4, 5, ["sad", "123", true]],
age: 10,
name: "老八",
eat: "秘制小汉堡",
show: {
skill: "鸡你太美",
b: function() {
console.log(this.a);
},
},
};
// 深拷贝
function cloneDeep(obj) {
// 筛选,如果是引用数据类型则进入if
if (Array.isArray(obj) || typeof obj === "object") {
// 创建变量接受深拷贝数据,如果obj是数组,则变量初始化为数组
let cloneObj = Array.isArray(obj) ? [] : {};
// 将变量进行遍历
Object.keys(obj).forEach(function(key) {
// 如果被拷贝对象为引用数据,则将递归后的数据放入对应的键内
if (Array.isArray(obj[key]) || typeof obj[key] === "object") {
cloneObj[key] = cloneDeep(obj[key]);
} else {
//否则直接拷贝键值
cloneObj[key] = obj[key];
}
});
// 然后返回拷贝后的对象
return cloneObj;
} else {
// 普通数据直接返回
return obj;
}
}
let cloneObj = cloneDeep(obj);
console.log(cloneObj);
cloneObj.show.skill();
有问题请大家交流指正