function clone(obj, hash = newWeakMap()) {
if (obj instanceofRegExp)
return newRegExp(obj);
if (obj instanceofDate)
returnnewDate(obj);
if (obj === null || typeof obj !== ‘object’) { return obj; }
//hash.has根据是否有key关联对象返回一个Boolean值。
if (hash.has(obj)) {
//hash.get返回key关联对象, 或者 undefined(没有key关联对象时)。
return hash.get(obj) }
//如果obj是数组那么obj.constructor是[Function:Array]
//如果obj是对象那么obj.constructor是[Function:Object]
let t = new obj.constructor();
//在 hash.set中设置一组key关联对象,返回这个 WeakMap对象
hash.set(obj, t);
for (let key in obj) {
if (obj.hasOwnProperty(key))
{ t[key] = clone(obj[key], hash);} }
return t
}
var wanset = { obj: [1, 23, 4], obk: ‘string’, owan: function () { return1234 } };
let seteqw = clone(wanset); console.log(‘deepclone:’, seteqw)