1

定义一些工具函数

    let _toString = Object.prototype.toString
    // 类型库
    let map = {
      array: 'Array',
      object: 'Object',
      function: 'Function',
      string: 'String',
      null: 'Null',
      undefined: 'Undefined',
      boolean: 'Boolean',
      number: 'Number'
    }

    // 获取类型
    let getType = item => {
      // console.log(_toString.call(item))
      // [object Number]

      return _toString.call(item).slice(8, -1) // Number
    }
    
    // 判断类型是否相同
    let isType = (item, type) => map[type] && map[type] === getType(item)
let deepCopy = (obj, protoList = []) => {
      // 首先定义需要被拷贝的对象
      let _obj = {}
      // 判断对象的类型
      if (isType(obj, 'array') || isType(obj, 'objest')) {
        //  根据obj类型,转换_obj的类型
        if (isType(obj, 'array')) _obj = []

        //  判断obj是否在其父属性列表中包含该属性
        let index = protoList.indexOf(obj)

        if (~index) {
          // 如果包含该对象,就不能循环了,直接复制_obj
          _obj = protoList[index]
        } else {
          // 如果不包含,先将被赋值对象push值属性列表中,然后进行循环obj的属性,进行赋值。
          protoList.push(obj)
          // 从这步开始,才是进行深度赋值
          for (let item in obj) {
            // 进一步遍历每一个属性,进行赋值
            _obj[item] = deepCopy(pbj[item], protoList)
          }
        }
      } else if (isType(obj, 'function')) {
        // 如果是function,就直接string以后赋值
        _obj = eval(`(${obj.toString()})`)
      } else {
        // 其他类型,直接赋值
        _obj = obj
      }
      return _obj
    }

Kisnnnn
46 声望5 粉丝

[链接]