当前位置: 首页 > news >正文

浅谈浅拷贝和深拷贝

理解浅拷贝和深拷贝js中的数据可以大致分为两种类型基本数据类型和引用数据类型。基本数据类型基本数据类型的变量的赋值可理解为深拷贝修改其中一个数据另一个数据不会随之变化引用数据类型引用数据类型分为key和value它们两个分开存储数据的值value在内存中而指针key指向内存中的value值引用数据类型的数据进行赋值其实只是拷贝了数据的指针key两个key指向的是同一个内存中的同一个值修改其中一个指针对值的修改另一个数据的值也会随着更改。浅拷贝方法浅拷贝拷贝的是地址如果有对象嵌套深层对象就会存在修改覆盖的问题数组的slice(start,end)数组的concat方法运用展开运算符推荐Object.assign()var a1 {name yiyi, age: 18}; var a2 Object.assign({}, a1); a2.name test; console.log(a1);//{name yiyi, age: 18} console.log(a2);//{name test, age: 18} //展开运算符 //我们也可以使用ES6的写法 var a3 {name yiyi, age: 18}; var a4 {...a3}; a4.name test2; console.log(a3);//{name yiyi, age: 18} console.log(a4);//{name test2, age: 18}//concat() var a1 [1,2,3]; var a2 a1.concat(); a1[0] 2; console.log(a1);// [2,2,3] console.log(a2);//[1,2,3] //展开运算符 //我们也可以使用ES6的写法 var a1 [2,2,2]; var a2 [...a1]; a1[0] 1; console.log(a1);// [1,2,2] console.log(a2);//[2,2,2] //slice() var a1 [3,4,5]; var a2 a1.slice(); a1[0] 1; console.log(a1);// [1,4,5] console.log(a2);//[3,4,5]如何实现浅拷贝function shallowCopy(obj) { // 排除非对象或 null 的情况 if (typeof obj ! object || obj null) return obj; // 判断是数组还是普通对象创建对应的新容器 const newObj Array.isArray(obj) ? [] : {}; // 遍历并复制自身的可枚举属性 for (let key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] obj[key]; } } return newObj; }深拷贝方法JSON.stringify()对简单的对象深拷贝不能拷贝具有方法Symbol和不可枚举对象等var o1 {a: 1, b: 2, c: 3, family: {child: child}}; var o2 JSON.parse(JSON.stringify(o1)); o1.a 2; o2.family.child child2 console.log(o1); //{2,2,3, family: {child: child}} console.log(o2);//{1,2,3, family: {child: child2}}JQuery库中的extend方法$.extend( [deep ], target, object1 [, objectN ] )object1 需要被合并的对象deep表示是否进行深拷贝target 合并后到该对象上var o1 {a: 1, b: 2, c: 3}; var o2 $.extend(true,{},o1); o1.a 2; console.log(o1); //{2,2,3} console.log(o2); //{1,2,3}如何实现深拷贝function deepClone(obj, hash new WeakMap()) { // 1. 处理基本类型和 null if (obj null || typeof obj ! object) return obj; // 2. 处理特殊内置对象如 Date、RegExp if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags); // 3. 解决循环引用如果该对象已经被拷贝过直接返回缓存 if (hash.has(obj)) return hash.get(obj); // 4. 根据原型创建对应的新容器保持数组或普通对象的类型 const cloneObj Array.isArray(obj) ? [] : Object.create(Object.getPrototypeOf(obj)); // 5. 存入缓存防止后续递归产生死循环 hash.set(obj, cloneObj); // 6. 递归拷贝所有自身属性包括 Symbol 属性 Reflect.ownKeys(obj).forEach(key { cloneObj[key] deepClone(obj[key], hash); }); return cloneObj; } // 测试循环引用 const original { a: 1, b: { c: 2 } }; original.self original; // 自己指向自己 const copy deepClone(original); console.log(copy.self copy); // 输出: true ✅ 完美处理循环引用简单介绍到这里哈哈哈这些真的是简单好用的方法适合日常使用关于多级对象和方法的拷贝以后再整理
http://www.zskr.cn/news/1394109.html

相关文章:

  • centos7 离线安线ansible的三种方法
  • 基于机器学习与社交媒体数据的社区韧性动态评估方法研究
  • 为什么你的Claude总在长文档结尾“突然失忆”?——基于Transformer注意力熵值分析,定位跨页信息坍缩临界点(附热力图可视化方案)
  • 幸福黄金回收(本地老店)|2026年5月镇江扬中市黄金回收价格+行情解析+避坑指南 - 润富黄金珠宝行
  • Excel实战之单元格合并与拆分
  • 人工智能训练师三级备考全攻略:零基础如何2-3周通关并申领3120元补贴?
  • 微信小程序Canvas抽奖动画:从九宫格到转盘的进阶实现与性能调优
  • Android Studio离线开发环境搭建
  • 基于GAN的网络流量异常检测:FlowGANAnomaly模型设计与实践
  • 基于CLIP语义对齐的fMRI视觉刺激分类:从大脑活动解码视觉概念
  • 3分钟掌握StPageFlip:打造专业级Web翻页动画的完整指南
  • 软件开发技术栈整理
  • 【ChatGPT使用限制解除终极指南】:20年AI架构师亲测的7大合规绕过路径与风险红线预警
  • 如何高效处理Excel大数据:Apache Fesod (Incubating) 终极指南
  • django-vue-admin部署教程:Docker-compose实现前后端一体化部署终极指南 [特殊字符]
  • 金宁汇Spiral AI完成关键一棒:在OpenAI颠覆性工作基础上,将Erdős问题下界优化129%
  • 焊盘的温度系数
  • 二、Git 本地仓库:从 git init 到第一次提交
  • 解锁创意宝库:8000+明日方舟开源视觉资源的跨界应用探索
  • 3种实战方案:Apache Fesod如何让Java处理百万行Excel不再OOM
  • 实际体验Taotoken多模型路由在单一接口故障时的自动切换
  • 基于云计算的分布式嵌入式系统仿真平台NetShip架构与实践
  • 留一法特征选择:直接优化模型性能的特征评估新思路
  • 告别游戏卡顿!彻底关闭Win10 Defender的Antimalware服务(保姆级图文教程)
  • ChatGPT使用限制解除全链路拆解(2024年最新GPT-4o/Turbo绕限白皮书)
  • GVM环境诊断与重建:从gvm-check-setup报错到全链路贯通
  • 2026年5月恩施旺哥黄金回收(连锁品牌)实时回收价格|行情解读+变现案例+避坑技巧+FAQ,恩施宣恩全县街道覆盖 - 润富黄金珠宝行
  • 探索cinolib核心功能:15个示例程序带你掌握多边形网格处理技巧
  • 从纹波到效率:LDO与DC-DC选型实战指南
  • 5个步骤掌握GLIP在昇腾NPU上的训练技巧与性能优化