位置: 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的自动化测试平台设计与实现)

  • 二手房交易需缴纳哪些费用
  • 政府补助是否可以抵扣税
  • 缴纳附加税会计科目怎么做
  • 账簿印花税的计税方法
  • 企业收到退回的所得税的账务处理
  • 住房贷款专项扣除
  • 做账一定要银行对账单吗
  • 营业外支出罚款所得税怎么处理
  • 建筑业适用什么行业
  • 发现财务人员违法怎么办
  • 利息收入增值税计税依据
  • 个人开劳务发票几个点
  • 税控盘续费会计分录怎么做
  • 豪华小汽车消费税
  • 医疗收费票据可以补打吗
  • 出纳可以做记账表格吗
  • 股东转让股份怎么转让
  • 增值税纳税申报表在哪里打印
  • 成本费用的结转方法
  • 包装物押金如何确定销售额?
  • 收到投资款怎么做凭证
  • 外购消费品已纳消费税
  • 餐饮定额发票怎么征税
  • 跨年度残保金退税怎么算
  • 财务会计制度备案操作流程
  • 内存频率调整教程图解
  • 在window10中可以使用什么窗口
  • macbookpro提醒事项
  • 监事会职权口诀
  • 预计负债的计量,如何确定最佳估计数
  • 为什么打开Win10虚拟器后一直在界面
  • php获取文件扩展内容
  • 然后用u盘重装系统
  • kb4507449安装失败
  • 车船税怎么计账
  • php获取指定日期的时间戳
  • 什么是动态表单
  • 润滑脂开票属于成品油吗
  • php弹出登录框
  • 使用uni-app开发网站
  • 如何一次性删除微信账单记录
  • 预缴所得税可以调减吗
  • 帝国cms8.0
  • sql server 2008设置角色
  • 深入分析原因,找出问题根源并有效破解
  • protobuf 文档
  • 公司有收入可不交社保吗
  • 审核后的凭证
  • 企业电子发票申请流程2023版
  • 质量扣款可以放到费用吗
  • 固定资产对外投资
  • 基本户是活期还是定期
  • 银行承兑汇票和贴现的区别
  • 转贴现占谁的授信
  • 代收运输费的会计分录
  • 收到社会保险基金结算表
  • 管理不善存货盘亏计入什么科目
  • 滴滴普票可以计算抵扣吗
  • 进口货物只有报关单能入账吗
  • 固定资产不能使用了怎么处理
  • 代办旅行社经营许可证
  • 银行账户维护费收费标准
  • mysql 5.7.24安装
  • mysql增删改查面试题
  • windows service 2008 r2
  • xp系统的硬盘装到win7电脑
  • win10h2版本
  • linux从一个命令获取数据到另一个命令
  • cocos2d-x教程
  • errorlnk2019怎么解决
  • [置顶]公主大人接下来是拷问时间31
  • 可重复进行编程的可编程器件有 ( )
  • 安卓机怎么直播
  • shell脚本-lt
  • jquery设置cookie过期时间
  • node.js的安装步骤
  • js取反运算符
  • 公司0申报怎么申报视频
  • 在水贝买的黄金
  • 金税三期个人所得税怎么申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设