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

  • 应交增值税已交税金是什么意思
  • 发票已经报送怎么处理
  • 交车险代收的车船费怎么做的科目呀?
  • 增值税的账务处理 月末怎么结转 案例
  • 合并报表成本法和权益法区别
  • 用友t3年末怎么结转
  • 新成立的公司一般纳税人还是小规模纳税人好
  • 上一会计年度什么意思
  • 开票有误的具体
  • 劳务公司外地劳务是否需要预缴税款及会计处理
  • 财付通-备付金账户
  • 银行承兑汇票向谁追索
  • 银行存款日记账最后一行怎么填
  • 没有收入是否可以入党
  • 个体户生产经营所得税税率表
  • 有限合伙企业清算
  • 以前年度发生的费用
  • 减免所得税怎么算税率
  • 办公设备发票开票内容
  • 外贸企业零退税怎么算
  • 政府补贴专项资金如何入账
  • 定期结汇会计分录?
  • 审计完结凭证要盖公章吗
  • windows10如何调出虚拟键盘
  • 预提费用利息会增加吗
  • 增值税专用发票的税率是多少啊
  • 交易性金融资产包括哪些项目
  • 企业合并进行过程中发生的各项直接相关费用
  • opencv开发项目
  • php底层原理
  • Cursor!!!GPT-4帮我写代码
  • 编程主要学什么东西
  • 【机器学习面试总结】————(一)
  • php入门实例
  • 信息技术服务是什么公司
  • 个体工商户开普通发票需要交税吗
  • 哪些税是季报
  • 转账收手续费不
  • 免税进项抵扣要做账吗
  • 应收账款红冲什么意思
  • 一税两费减免政策
  • 全年一次性奖金并入或单独哪个好
  • 被投资公司注销,投资收益需要交企业所得税你吗
  • 技术服务合同的税率
  • 出售金融资产计入
  • 发票申领多久才可以批
  • 购买其他权益工具投资时发生的交易费用
  • 增值税专用发票丢了怎么补救
  • 固定资产赠送后怎么做凭证
  • 其他权益工具包括交易性金融资产吗
  • 公司开业两年后辞职
  • 年初余额和期末余额对不上怎么办
  • 应收利息的账务处理方法
  • 物业公司代收水费账务处理
  • 高新技术企业退出机制
  • 已经支付的预付款 银行能更改为货到付款吗
  • 个人如何成立公司
  • 如何调优产业结构
  • mysql b+树节点大小
  • window10怎么window7
  • 安装win7系统需要注意什么
  • redhat配置
  • win7开机出现标志后就重启
  • win7激活后grub
  • 保存 linux
  • 如何解决win7系统卡顿
  • linux系统叫啥
  • android app启动过程
  • cocos2dx开发鸿蒙app
  • python加密模块
  • android camera preview
  • listview设置item宽度
  • 小米手机图库图标
  • 新疆油田在哪个地方
  • 税务软件服务商
  • 开票软件中如何打印已开具的发票
  • 云阅卷平台登录入口云南省
  • 淄博新农合怎么网上缴费
  • 武汉经济技术开发区法院立案庭电话
  • 工会经费支出审批制度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设