Fork me on github

js 深拷贝

对于深拷贝 一直使用的都是 JSON 和 lodash 的方法, 今天空下来自己手写个 深拷贝方法, 把想到的一些情况, 包括对 函数、Symbol、正则、日期对象 都做了处理。 基本上满足了了日常需求。代码如下:

// 深拷贝
function deepClone(arg) {

  let typeIncludes = ['string', 'boolean', 'number', 'undefined'] // 基础类型
  let redundanceIncludes = ['null', 'symbol', 'function', 'regexp', 'date'] // 冗余类型

  let typeObject = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()

  function dealArray(item) {
    let arr = item.map( i => {
      return deepClone(i)
    } )
    return arr
  }

  function dealObject(obj) {
    let newObj = {}
    for (const key in obj) {
      newObj[key] = deepClone(obj[key])
    }
    return newObj
  }

  if(typeIncludes.includes(typeObject(arg)) || redundanceIncludes.includes(typeObject(arg)) ) return arg

  return typeObject(arg) === 'array' ? dealArray(arg) : dealObject(arg)
  
}

有不足的地方, 还请评论区留言😄😀

posted @ 2019-09-10 22:31  vanst  阅读(315)  评论(0编辑  收藏  举报