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)