function deepCopy(obj){
// 直接返回简单数据类型
if (
typeof obj === "number" ||
typeof obj === "string" ||
typeof obj === "boolean" ||
obj === null ||
obj === undefined
) {
return obj;
}
// 基obj的原型创建新对象
const copy = Object.create(Object.getPrototypeOf(obj));
// getOwnPropertyNames用于获取自身对象中所有的属性,包括不可枚举的属性,不包括原型里的属性。
var keys = Object.getOwnPropertyNames(obj);
keys.forEach(key => {
// 如果是Date对象,特殊处理
if (Object.prototype.toString.call(obj[key]) === "[object Date]") {
// 获取日期的毫秒时间戳
var time = obj[key].valueOf();
// 重新生成该时间的日期对象
copy[key] = new Date(time);
}
const descriptor = Object.getOwnPropertyDescriptor(obj, key);
// 如果元素值是对象或数组,则重新递归赋值
if (
Object.prototype.toString.call(descriptor.value) === "[object Object]" ||
Object.prototype.toString.call(descriptor.value) === "[object Array]"
) {
descriptor.value = deepCopy(descriptor.value)
}
Object.defineProperty(copy, key, descriptor);
})
return copy
}
var obj = { a: {b: 666} };
var copyObj = deepCopy(obj);
console.log(copyObj); // { a: {b: 666} }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。