深拷贝和浅拷贝

深拷贝

新的对象

实现方式

1.利用JSON.stringify将对象转成JSON字符串,再用JSON.parse把字符串解析成对象

javascript 复制代码
JSON.parse(JSON.stringify())

2.lodash的_.cloneDeep

3.手写递归循环

javascript 复制代码
function deepClone(obj, hash = new WeakMap()) {
  if (obj === null) return obj // 如果是null或者undefined我就不进行拷贝操作
  if (obj instanceof Date) return new Date(obj)
  if (obj instanceof RegExp) return new RegExp(obj)
  // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
  if (typeof obj !== "object") return obj
  // 是对象的话就要进行深拷贝
  if (hash.get(obj)) return hash.get(obj)
  let cloneObj = new obj.constructor()
  // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
  hash.set(obj, cloneObj)
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      // 实现一个递归拷贝
      cloneObj[key] = deepClone(obj[key], hash)
    }
  }
  return cloneObj
}
相关推荐
间彧1 天前
Tailwind CSS详解
前端
间彧1 天前
Headless UI详解
前端
han_1 天前
Vue.js 为什么要推出 Vapor Mode?
前端·javascript·vue.js
oden1 天前
AI重构10000行老代码:2周完成1个月工作量的真实复盘
前端·aigc·ai编程
小满zs1 天前
Next.js第十二章(RSC/服务端组件/客户端组件)
前端
亿元程序员1 天前
明明直接用就可以了,非要在Creator里面写???
前端
wadesir1 天前
Nginx负载均衡代理协议详解(从零开始搭建高可用Web服务)
前端·nginx·负载均衡
秋氘渔1 天前
Vue 3 组合式写法:侦听器 watch 和 watchEffect 的区别及使用技巧
前端·javascript·vue.js·watch·watcheffect
想睡八个小时1 天前
已包含的文件名 “a.vue“ 仅大小写与文件名 “A.vue“ 不同
前端·vscode
The_era_achievs_hero1 天前
Echarts
前端·javascript·echarts