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

  • 劳务报酬所得税可以退税吗
  • 企业所得税如何做分录
  • 不征税收入确认递延收益如何填报
  • 固定资产可以一次性摊销吗
  • 企业贷款合同签订后多久放款
  • 未开票收入次月如何申报增值税
  • 利润总额与毛利的区别
  • 作废的发票还需要保存吗
  • 个体小规模一般纳税人税率多少
  • 金税盘技术维护费账务处理
  • 小企业会计准则适用于哪些企业
  • 增值税一般纳税人税率是多少?
  • 房地产公司将自建自用房产出售 土地增值税
  • 机动车销售发票可以跨年抵扣吗
  • 支付本月租金计入什么科目
  • 企业发生的装修费可以几年摊销
  • 一个订单只能申请一次退款吗
  • 企业办税人员收入怎么算
  • 一般纳税人企业所得税政策最新2023税率
  • 以前工会是没有公章的吗
  • 一般纳税人年审证明
  • 律师事务所收费单据
  • 社会团体收取的会费可以用于哪些方面
  • 个体户查账征收没有成本票怎么办
  • 股票派息后会除权吗
  • 工程建设劳务费怎么算
  • 企业所得税税率表2023年最新
  • 残疾人保障金怎么做账
  • 计提的坏账准备可以转回吗
  • 剑灵2.0win7
  • 股东投入的资金可以退回吗
  • 固定资产不入账是谁的责任
  • 收到折扣发票怎么处理
  • php递归算法经典实例
  • php可以做什么脚本
  • 不用指令
  • 格洛利亚酒店
  • php类的使用
  • java 调用go
  • 港口机场铁路
  • 工业企业成本核算的内容是
  • 国税代开普票能作废吗
  • php计算时间
  • 创建数据的命令是
  • mysql5.7分区表
  • 应付账款转入营业外收入的证明
  • 前端必学
  • phpcms使用教程
  • 普通发票可抵税吗
  • mysql备份数据
  • 汽车修理厂会计账务处理
  • 钉钉财务软件怎么用
  • 长期股权投资转让会计处理
  • 公司破产账务处理
  • 职工福利费无发放原因
  • 印花税的通俗理解
  • 收不回来的应收账款
  • 销项税票怎么开
  • 小规模发票冲红了退税怎么处理
  • 财务报表怎么做
  • 交易性金融资产属于什么科目
  • sql server中的文件位置可以很灵活
  • linux下mysql开启远程访问权限 防火墙开放3306端口
  • win8安装程序在哪里
  • xp ie浏览器无法显示网页
  • dll文件在哪儿
  • windows7字体安装方法
  • android 快速开发
  • css display none之后怎么显示回来
  • angular动态生成表单
  • linux如何查看当前shell
  • unity behavior designer
  • jquery日期控件 datepicker
  • vue瀑布流实现
  • javascript如何禁用
  • python语言例子
  • 百旺税控盘口令认证失败PiN被锁
  • 财政拨款是否需交税
  • 房地产预缴土增值税
  • 江西国税局电话客服热线
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设