JS - 如何实现深拷贝?

2020-12-31  本文已影响0人  我是Msorry
  1. 递归
  2. 判断类型 不同的类型有不同的方法
  3. 检查环(也叫循环引用)一个对象引用了自己,递归的时候容易出不来
  4. 需要忽略原型,不拷贝原型,拷贝原型,特别浪费内存
function clone(target, map = new Map()) {
    if (target !== null && typeof target === 'object') { // 先判断类型,是简单类型还是引用类型
        let cloneTarget = Array.isArray(target) ? [] : {};//判断是对象还是数组
        if (map.get(target)) {//检查环(循环引用)
            return target;
        }
        map.set(target, true);
        for (let key in target) {
          if (target.hasOwnProperty(key)) {// 判断是否是对象上的属性,而不是原型上的属性
            cloneTarget[key] = clone(target[key], map);//递归克隆
          }
        }
        return cloneTarget;
    } else {
        return target;
    }
};

function cloneFunction(fn) {
    const bodyReg = /(?<={)(.|\n)+(?=})/m;//匹配函数体
    const paramReg = /(?<=\().+(?=\)\s+{)/;//匹配参数
    const fnString = fn.toString();//把函数转成字符串
    if (fn.prototype) {
        const param = paramReg.exec(fnString);
        const body = bodyReg.exec(fnString);
        if (body) {
            if (param) {
                const paramArr = param[0].split(',');
                return new Function(...paramArr, body[0]);
            } else {
                return new Function(body[0]);
            }
        } else {
            return null;
        }
    } else {
        return Function('"use strict";return fnString')();
      }     
}
上一篇下一篇

猜你喜欢

热点阅读