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

【JavaScript】拷贝对象的几种方式与对比

#工作中拷贝对象是常有的事,我们需要分清楚深浅拷贝,一般来说要做的都是深拷贝,不然会有关联影响#

解构赋值

es6新语法,简洁是简洁,但是需要注意深拷贝只针对第一层

使用方式:{...obj}

let stu = {name: 'aaa',age: 18,info: {grade: 5,class: 4,},say: function() {console.log('hello');}
}let stu1 = {...stu};
stu1.info.grade = 2;

这里原对象的grade也会被更改

JSON.parse()和JSON.stringify()

let stu2 = JSON.parse(JSON.stringify(stu))
console.log(stu2) // { name: 'aaa', age: 18, info: { grade: 2, class: 4 } }

无法复制函数,因为函数不是JSON格式的一部分

递归复制

function deepCopy(obj) {// 处理原始类型和nullif (typeof obj !== 'object' || obj == null) return obj;// 如果是对象或数组,则创建新对象let newObj;if (Array.isArray(obj)) {newObj = [];} else {newObj = {};}// 遍历原始对象的所有属性,并对每个属性执行深拷贝for (let key in obj) {newObj[key] = deepCopy(obj[key]);}return newObj;
}
let stu3 = deepCopy(stu);

前面两种方式的缺陷都弥补了,但这么写实在是有点繁琐,而且其实还需要完善哈哈哈

lodash.cloneDeep

终极爸爸来了,借助工具

const lodash = require('lodash');let stu4 = lodash.cloneDeep(stu)

简洁的不能再简洁了,记得要先安装一下依赖噢~

http://www.lryc.cn/news/457581.html

相关文章:

  • 高防服务器为何有时难以防御CC攻击及其对策
  • 性能测试工具locust —— Python脚本参数化!
  • Java中的拦截器、过滤器及监听器
  • Nginx 和 Lua 设计黑白名单
  • 【部署篇】Redis-01介绍‌
  • R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
  • 【text2sql】ReFSQL检索生成框架
  • 美国市场跨平台应用程序本地化流程的特点
  • STM32 实现 TCP 服务器与多个设备通信
  • EdgeNAT: 高效边缘检测的 Transformer
  • Github优质项目推荐 - 第六期
  • 力扣21~30题
  • AGI|如何构建一个RAG应用?入门新手攻略!
  • 【.NET 8 实战--孢子记账--从单体到微服务】--角色(增加/删除/修改/查询)
  • 数据结构-栈与队列笔记
  • DevExpress WPF中文教程:如何解决数据更新的常见问题?
  • SpringBoot基础(四):bean的多种加载方式
  • JavaScript网页设计案例:构建动态交互的在线图书管理系统
  • 嵌入式数据结构中线性表的具体实现
  • Redis高级篇 —— 分布式缓存
  • 彩族相机内存卡恢复多种攻略:告别数据丢失
  • 【C语言】计算需要的缓冲区大小
  • Renesas R7FA8D1BH (Cortex®-M85) 上超声波测距模块(HC-SR04)驱动开发
  • 短视频矩阵系统独立源码/源头开发
  • k8s部署jenkins集群,配置集群kubernetes plugin的pod模板
  • 微软确认Word离奇Bug 命名不当会导致文件被删
  • Vue包的安装使用
  • 大模型1-本地部署实现交互问答
  • 鸿蒙架构-系统架构师(七十八)
  • 大数据存储计算平台EasyMR:多集群统一管理助力企业高效运维