js深拷贝的四种境界

看了一些博客和代码后,总结一下:

第一层境界:JSON.parse(JSON.stringify)

巧妙利用JSON, 但是也受限于json,只支持json内的数据类型:Boolean,Null,Number,String,Object;Object只是普通的字面量对象以及嵌套字面量对象,Boolean,Null,Number,String的Object,不包括Function,RegExp,Date等等

第二层境界:30-seconds-of-code/deepClone

先来个有意思的表达式: Array.from(Object.assign({length: 2}, [1, 2])) 巧妙利用 Object.assign + Array.from,凡是继承于Object的Function, Date, Error, RegExp, Symbol, Map, WeakMap都可以实现深clone,以及(类)数组: arguments,Array,Set,WeakSet,ES7+的ArrayBuffer,DataView,Float32Array,Float64Array,Int8Array,Int16Array,Int32Array, Uint8Array, Uint8clampedArray, Uint16Array, Uint32Array

function deepClone (obj) {
  const clone = Object.assign({}, obj)
  Object.keys(clone).forEach(
    key => (clone[key] = typeof clone[key] === 'object' ? deepClone(obj[key]) : obj[key])
  )
  return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone
}
复制代码

第三层境界:Lodash-deepClone

支持的数据类型是在第二层境界里面提及的一致,但是实现方式不一样,Lodash针对细分的不同数据类型会有不同的clone逻辑,分在不同的子文件,比如:

lodash-cloneDeep

function cloneRegExp (regexp) {
  const result = new regexp.constructor(regexp.source, reFlags.exec(regexp))
  result.lastIndex = regexp.lastIndex
  return result
}

export default cloneRegExp
复制代码

第四层境界: 考虑循环引用

在第二种,第三种的境界上考虑递归爆栈,循环引用,引用丢失的情况如何处理,掘金上的这一篇文章讲的我头大,此乃第四种境界

关于JavaScript-clone就讲这么多了,最为简便的方法在于第二种,也是应用最广的,特殊场景考虑第四种。

转载于:https://juejin.im/post/5bc737876fb9a05d1b2e8606

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值