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

  • 小规模纳税人500万以内免税
  • 行政事业单位决算编制流程图
  • 冲红的发票税款计提分录要冲红吗
  • 支付宝商户服务电话
  • 编制初始计量有什么要求
  • 个体户雇佣临时工
  • 怎么核算金融企业收入
  • 法院案件受理费计算器
  • 开发成本存货减少
  • 接受股权转让要交什么税
  • 实收资本不到账如何做凭证
  • 外币资本金使用范围
  • 物业公司收到开发代付物业管理费怎么做账
  • 农产品加计扣除1%政策
  • 验资后资金转给第三方
  • 商品进销差价账户的用途性质及核算内容
  • 生产成本 营业成本 营业费用
  • 在不同单位拿的工资怎么计税?
  • 单位旧电脑处置
  • 什么叫未完税
  • 土地计入无形资产包括的税费
  • 企业所得税申报表在哪里打印
  • 什么情况需要对房屋外观拍照
  • 车辆购置税退税条件
  • 原材料计入资产成本吗
  • 收到往来款的账务处理
  • 建筑工地临时工工伤
  • linux 传输文件
  • 超限量发票申请下来后怎么操作
  • 电费打发票用哪个软件
  • 《设计模式》
  • 授渔计划是什么意思
  • 用css画一个扇形
  • tr命令详解
  • 应收账款周转天数减少说明什么
  • 未开票收入是否含税
  • ubuntu下使用SQLite3的基本命令
  • 0税率可以抵扣进项税吗
  • 哪些所得需要去税务登记
  • 删除mysql57服务
  • 企业增值税的征收方式
  • 银行对账单和存款日记账怎样核对并标识
  • 火车票丢了怎么办
  • 用友t6操作流程
  • 筹建期间业务招待费的财税处理规定
  • 预缴增值税需要提交什么资料
  • 可抵扣进项税额的六种类型
  • 收客户货款怎么说话
  • 小企业固定资产折旧方法
  • 预收款不开票怎么处理
  • 宾馆手撕发票图片
  • 关于母子公司的关系的表述,正确的是( )
  • 企业的专利收费是多少
  • 进口产品内销如何交税
  • 招待费住宿
  • 企业盘盈盘亏的固定资产先要计入待处理财产损益
  • 建立新公司需要做什么
  • sql server错误和使用情况报告
  • 网站的运维
  • fedora iso
  • windows 运行
  • wcesmgr.exe - wcesmgr 是什么进程
  • conf文件用什么软件打开
  • xp系统怎样阻止脱机窗口弹出
  • make_sock: could not bind to address 0.0.0.0:443
  • win10系统如何打开
  • 最新版win10版本号
  • node.js实战
  • shell脚本 教程
  • bootstrap 多级菜单
  • nodejs 获取命令行参数
  • android检测网络差
  • linux shell脚本编程100例
  • unity gui layer
  • python django orm
  • JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
  • 自然人电子税务局网页端
  • 四川召开延迟退休座谈会
  • 支付宝登录电子社保卡显示已被其他账号登录
  • 余杭区税务局地址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设