美文网首页
JS - 如何实现深拷贝?

JS - 如何实现深拷贝?

作者: 我是Msorry | 来源:发表于2020-12-31 09:30 被阅读0次
    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')();
          }     
    }
    

    相关文章

      网友评论

          本文标题:JS - 如何实现深拷贝?

          本文链接:https://www.haomeiwen.com/subject/snqljktx.html