function deepClone(obj) { if (!/^object$/i.test(typeof obj)) return obj; //基本数据类型或者函数,直接return let constructor = obj.constructor; if (/^(date|regexp)$/i.test(constructor)) return new constructor(obj); //日期或正则对象,特殊处理 let clone = new constructor(); //数组或对象,直接生成实例 for (let key in obj) { if (!obj.hasOwnProperty(key)) break; //非自有属性,说明已经进入原型查找,直接跳出循环(自有属性中只有某些特殊的属性如length是不可枚举,内置类公共属性除自定义外大部分都不可枚举) clone[key] = deepClone(obj[key]); } return clone } let newObj=deepClone({ a:[1,2,3], date:new Date(), b:1, c:{ d:2 } }) console.log(newObj)