位置: IT常识 - 正文

深拷贝的五种实现方式(深拷贝的实现方式)

编辑:rootadmin
深拷贝的五种实现方式 一、什么是深拷贝和浅拷贝浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是指向内存的地址 ,所以如果其中一个对象改变了这个引用类型的值,就会影响到另一个对象。深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。二、实现深拷贝的五种方式

推荐整理分享深拷贝的五种实现方式(深拷贝的实现方式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深拷贝的三种实现方式,深拷贝的几种方法,深拷贝的定义,深拷贝的三种实现方式,深拷贝的实现原理,深拷贝的实现原理,深拷贝的定义,深拷贝的三种实现方式,内容如对您有帮助,希望把文章链接给更多的朋友!

1、递归调用

// 递归调用const deepCopy = (obj) => { // 判断传入的值是否为一个对象 if (obj === null && typeof obj !== "object") { return obj; } // 判断对象的类型 注意这里不考虑包装类对象 if (Object.prototype.toString.call(obj) === "[object Date]") { return new Date(obj); } if (Object.prototype.toString.call(obj) === "[object RegExp]") { return new RegExp(obj); } if (Object.prototype.toString.call(obj) === "[object Undefined]") { return new Error(obj); } // 判断对象是类 let newObj = Array.isArray(obj) ? [] : {} for(let item in obj){ if(typeof obj[item] === 'object') { newObj[item] = deepCopy(obj[item]) }else { newObj[item] = obj[item] } } return newObj};const foo = { name: '张三', info: { age: 24 }}const newFoo = deepCopy(foo)console.log(foo, newFoo)foo.info.age = 25console.log(foo, newFoo)深拷贝的五种实现方式(深拷贝的实现方式)

2、JSON.stringify + JSON.parse :::info 更多关于JSON.stringigy的注意事项请看MDN :::

// JSON.stringify// 情况一: 对象内不存在undefined、symbol、function类型的属性时// const foo = {// name: '张三',// info: {// age: 24// }// }// const newFoo = JSON.parse(JSON.stringify(foo))// console.log(foo, newFoo) // { name: '张三', info: { age: 24 } } { name: '张三', info: { age: 24 } }// foo.info.age = 25// console.log(foo, newFoo) // { name: '张三', info: { age: 25 } } { name: '张三', info: { age: 24 } }// 情况二:当对象内存在undefined、symbol、function类型的属性时,在序列化过程中会被忽略。// 当属性为NaN 和 Infinity 格式的数值及 null 都会被当做 nul// const foo = {// name: "张三",// age: undefined,// height: 183,// gender: Symbol("男"), //// say: () => {},// aa: NaN,// };// const newFoo = JSON.parse(JSON.stringify(foo));// console.log(foo, newFoo); // {aa: NaN, age: undefined, gender: Symbol(男), height: 183, name: "张三"} { {name: '张三', height: 183, aa: null} }// JSON.stringify() 第二个参数为可选参数,可以是一个函数或者数组,// 当是数组时表示需要被转化的属性列表,但undeinfed,symbol,function类型的属性依然会被忽略// const newFoo = JSON.parse(JSON.stringify(foo, ['name', 'age', 'gender', 'say', 'aa']));// console.log(newFoo) // {name: '张三', aa: null}

3、lodash

const _ = require('lodash')const foo = { name: '张三', info: { age: 24 }}const newFoo = _.cloneDeep(foo);foo.info.age = 25console.log(foo, newFoo) // { name: '张三', info: { age: 25 } } { name: '张三', info: { age: 24 } }

4、Object.assgin

注意:只有当对象中没有嵌套对象时,才可以实现深拷贝const foo = { name: '张三', age: 24}const newFoo = Object.assign({}, foo)foo.age = 25console.log(foo, newFoo) // {name: '张三', age: 25} {name: '张三', age: 24}// 对象中有内嵌的对象时const foo = { name: '张三', info: { age: 24 }}const newFoo = Object.assign({}, foo)foo.info.age = 25console.log(foo, newFoo) // { name: '张三', info: { age: 25 } } { name: '张三', info: { age: 25 } }

5、structuredClone

const foo = { name: '张三', info: { age: 24 }}const newFoo = structuredClone(foo) // foo.info.age = 25console.log(foo, newFoo) // { name: '张三', info: { age: 25 } } { name: '张三', info: { age: 24 } }

该方法为Web最新的 API,存在兼容问题

本文链接地址:https://www.jiuchutong.com/zhishi/295281.html 转载请保留说明!

上一篇:ntp-keygen命令 生成NTP主机密钥(ntpdate 命令)

下一篇:基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)(基于Selenium的自动化测试平台设计与实现)

  • 公司注销前存货低价标准
  • 个税手续费返还要交增值税吗
  • 工伤在门诊的收据能报销吗
  • 会计记账凭证如何填制
  • 自产自用应税消费品的消费税,其纳税环节
  • 公积金是上个月的还是本月的
  • 设备租赁合同需要审核吗
  • 临时占用耕地可以种树吗
  • 供货商对账单跨月返利怎么做账?
  • 购买商标权税率多少
  • 使用空头支票被银行冻结
  • 集体土地上的不动产能符合异议28条规定吗
  • 公司买车可以抵什么税
  • 个体户上季度未申报能补报吗
  • 关于设备安装调试的说法
  • 互联网税务行动计划五大板块
  • 财务抄税怎么抄
  • 事业单位没有税号 选个人可以吗
  • 所得税会计方法有哪几种
  • 普通发票税收
  • 税收滞纳金可以税前扣除吗
  • 增值税小规模纳税人减免增值税政策
  • coms恢复默认设置
  • edge浏览器总是打开新的网页
  • bios怎么更改硬盘
  • 老板的工资属于
  • 冲往年管理费用的账务处理是否涉及所得税
  • 实缴注册资本股权转让怎么交税
  • 房屋出租房产税如何计算
  • 企业所得税季度申报表A类
  • 山东省项目
  • 快递行业规矩
  • point network
  • 写一个简单的php程序代码
  • 工程竣工决算会计账务处理
  • autoscle
  • 融资租赁初始直接费用计入哪个科目
  • 个体工商户有固话吗
  • 应付职工薪酬怎么冲平
  • spring5和6差别大吗
  • 增值税免税申报
  • 银行承兑是什么意思
  • 小规模增值税减征额怎么算
  • 化工企业 设备
  • 非营利组织会计就是用于确认、计量
  • 应付职工薪酬账户的明细账户有
  • 资产总额是营业收入吗
  • 预付卡的增值税处理
  • 印花税的征税对象和计税依据
  • 消费税纳税人的具体纳税期限由主管税务机关
  • 收到土地使用权转让怎么做账
  • 关于幼儿园的会议内容
  • 模具报价成本核算方法
  • 出口货物发生退运损失由外贸承担还是厂家
  • 如何确定开票内容
  • 税款滞纳金征收比率怎么算
  • 淘宝电商怎么做账
  • 现金折扣与商业折扣的计算
  • macbook分屏功能
  • 修改远程桌面端口后,远程桌面连不上
  • 无法进入睡眠状态
  • windows service 2008 r2
  • 怎么找回手机删除的照片和视频
  • win8 网络连接
  • centos 安装chia
  • 重装win7系统后鼠标键盘不能用
  • win10极限模式
  • 用户dsn添加
  • cmd命令怎么重启
  • python开发的程序
  • 置顶聊天折叠怎么开启
  • android中的webview
  • js接收excel文件流
  • js日期格式转换
  • 广东省国家税务局电子税务局官网
  • 江苏电子税务局网站官网下载
  • 纽约消费税多少
  • 国税局辽宁省国税局
  • 审计验资费计入什么科目
  • 江西鹰潭潭花酒60度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设