es5 深拷贝对象封装

方案一

  1. function deepClone(origin, target) {
  2. var tar = target || {}; //如果没有传参则设置默认值
  3. var toStr = Object.prototype.toString(); //判断类型
  4. var arrType = '[object Array]';
  5. for (k in origin) {
  6. if (origin.hasOwnProperty(k)) { //是否是自身的属性
  7. if (typeof origin[k] === 'object' && origin[k] === null) { //排除null 因为typeof null 是 object
  8. tar[k] = toStr.call(origin[k]) === arrType ? [] : {}; //如果是引入类型则存储起来然后再执行函数判断
  9. deepClone(tar[k]);
  10. } else {
  11. tar[k] = origin[k];
  12. }
  13. }
  14. }
  15. return tar;
  16. }

知识点归纳

1.判断数据类型Object.prototype.toString.call() 结果为 [object Array] 或 [object object]
2.hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

方案二

function deepClone(origin, hashMap = new WeakMap()) {
    if (origin == undefined || typeof origin !== 'object') {
        return origin;
    }

    if (origin instanceof Date) {
        return new Date(origin);
    }

    if (origin instanceof RegExp) {
        return new RegExp(origin);
    }

    const hashKey = hashMap.get(origin);

    if (hashKey) {
        return hashKey;
    }

    const target = new origin.constructor();

    hashMap.set(origin, target);

    for (let k in origin) {
        if (origin.hasOwnProperty(k)) {
            target[k] = deepClone(origin[k], hashMap);
        }
    }
    return target;
}

let test1 = {};
let test2 = {};

test2.test1 = test1;
test1.test2 = test2;

console.log(deepClone(test2));

WeakMap 知识点
7、Set集合与Map集合

面试题 let test1 = {}; let test2 = {};test2.test1 = test1;test1.test2 = test2;

function deepClone(origin, hashMap = new WeakMap()) {
    if (origin == undefined || typeof origin !== 'object') {
        return origin;
    }

    if (origin instanceof Date) {
        return new Date(origin);
    }

    if (origin instanceof RegExp) {
        return new RegExp(origin);
    }

    const hashKey = hashMap.get(origin);

    if (hashKey) {
        return hashKey;
    }

    const target = new origin.constructor();

    hashMap.set(origin, target);

    for (let k in origin) {
        if (origin.hasOwnProperty(k)) {
            target[k] = deepClone(origin[k], hashMap);
        }
    }
    return target;
}

let test1 = {};
let test2 = {};

test2.test1 = test1;
test1.test2 = test2;

console.log(deepClone(test2));