当前位置:首页 > 经验 >

深拷贝和浅拷贝的方法(深拷贝的方法及优缺点)

来源:原点资讯(www.yd166.com)时间:2022-10-24 22:44:42作者:YD166手机阅读>>

由于JavaScript中对象是引用类型,保存的是地址,深、浅拷贝的区别是,当拷贝结束后,在一定程度上改变原对象中的某一个引用类型属性的值,新拷贝出来的对象依然受影响的话,就是浅拷贝,反之就是深拷贝。

浅拷贝的几种实现方法

第一种方法: Object.assign()会拷贝原始对象中的所有属性到一个新对象上,如果属性为对象,则拷贝的是对象的地址,改变对象中的属性值,新拷贝出来的对象依然会受影响。

var obj = { name: '张三', age: 23, isStudent: false, job: { name: 'FE', money: 12 } } var newObj = Object.assign({}, obj); obj.job.money = 21; console.log(newObj.name); // 输出张三 console.log(newObj.age); // 输出23 console.log(newObj.job.money);// 输出21,受影响

第二种方法:...扩展运算符是ES6新增加的内容

var obj = { name: '张三', age: 23, isStudent: false } var newObj = {...obj}; console.log(newObj.name); // 输出张三 console.log(newObj.age); // 输出23 深拷贝几种实现方式

第一种方法: 利用JSON的序列化和反序列化方法,可以实现简易对象深拷贝,但此种方法有较大的限制:

  1. 会忽略属性值为undefined的属性
  2. 会忽略属性为Symbol的属性
  3. 不会序列化函数
  4. 不能解决循环引用的问题,直接报错

var obj = { name: '张三', age: 23, address: undefined, sayHello: function() { console.log('Hello'); }, isStudent: false, job: { name: 'FE', money: 12 } } var newObj = JSON.parse(JSON.stringify(obj)); obj.job.money = 21; console.log(newObj.name); // 输出张三 console.log(newObj.age); // 输出23 console.log(newObj.job.money); // 输出12 console.log(newObj.address); // 报错 console.log(newObj.sayHello());// 报错

第二种: 实现自己简易的深拷贝函数

function deepClone(obj) { function isObject(o) { return (typeof o === 'object' || typeof o === 'function') && o !== null; } if(!isObject(obj)) { throw new Error('非对象'); } var isArray = Array.isArray(obj); var newObj = isArray ? [...obj] : {...obj}; Reflect.ownKeys(newObj).forEach(key => { newObj[key] = isObject(newObj[key]) ? deepClone(newObj[key]) : newObj[key]; }) return newObj; } var obj = { name: 'AAA', age: 23, job: { name: 'FE', money: 12000 } } var cloneObj = deepClone(obj); obj.job.money = 13000; console.log(obj.job.money); // 输出13000 console.log(cloneObj.job.money);// 输出12000

第三种方法: 使用lodash第三方函数库实现(需要先引入lodash.js)

var obj = { name: '张三', age: 23, isStudent: false, job: { name: 'FE', money: 12 } } var newObj = _.cloneDeep(obj); obj.job.money = 21; console.log(newObj.name); // 输出张三 console.log(newObj.age); // 输出23 console.log(newObj.job.money);// 输出12,不受影响

如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/145.html

栏目热文

白糖和化肥为什么能爆炸(国家为什么要管控白糖)

白糖和化肥为什么能爆炸(国家为什么要管控白糖)

【军武次位面】作者:leon最近,克里米亚大桥被炸毁的消息想必是引起了全球的关注与报道,作为当前俄乌冲突中的极具战略价值...

2022-10-24 22:10:34查看全文 >>

满月剃头仪式流程(满月剪胎毛口诀)

满月剃头仪式流程(满月剪胎毛口诀)

引言中国人从古至今都特别重视“满月”这个日子,小孩生下来满一个月的时候,家人们就会设席摆宴,邀请朋好友来给孩子庆祝满月。...

2022-10-24 21:59:43查看全文 >>

产妇满月当天禁忌(产妇满月当天吃什么好)

产妇满月当天禁忌(产妇满月当天吃什么好)

满月即是弥月之喜,这是孩子出生后比较重要的民俗喜事之一,人们常说的“满月酒”便是指孩子产后满月时敬警神祀、庆祝请客的酒...

2022-10-24 21:53:38查看全文 >>

剃胎发最佳时间(剃胎头有什么讲究和忌讳)

剃胎发最佳时间(剃胎头有什么讲究和忌讳)

宝宝出生一个月了,不少家庭开始准备一件大事,那就是给宝宝过满月,有的地方还要当着亲戚朋友的面给宝宝剃胎发,不管是男宝宝还...

2022-10-24 22:15:46查看全文 >>

满月剃头的最佳日子(满月剃头要选日子吗)

满月剃头的最佳日子(满月剃头要选日子吗)

在汉族人中,婴儿满月礼除了敬祖、庆贺“弥月之喜”的仪式外,各地还有一些特有的仪俗。满月剃发就是普遍流行的一种重要仪俗。满...

2022-10-24 22:01:42查看全文 >>

深拷贝和浅拷贝和零拷贝的区别(深拷贝与浅拷贝示意图)

深拷贝和浅拷贝和零拷贝的区别(深拷贝与浅拷贝示意图)

原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建...

2022-10-24 22:15:15查看全文 >>

为什么要深拷贝浅拷贝(零拷贝和深拷贝)

为什么要深拷贝浅拷贝(零拷贝和深拷贝)

关于对象的拷贝,大部分时间我们用的都是浅拷贝,比如赋值符号(“=”)以及memcpy()等。那么既然浅拷贝这么简单,为...

2022-10-24 22:08:28查看全文 >>

浅拷贝和深拷贝的值会不会变(高拷贝和低拷贝的区别)

浅拷贝和深拷贝的值会不会变(高拷贝和低拷贝的区别)

前面我们曾经聊到列表从内存的角度是什么样的?有兴趣的可以关注我,看一下《python之从内存读写的角度,学习并玩转lis...

2022-10-24 22:44:50查看全文 >>

深拷贝解决浅拷贝的问题(深拷贝的缺点)

深拷贝解决浅拷贝的问题(深拷贝的缺点)

作者:小丑转发链接:https://mp.weixin.qq.com/s/i_vGi8C5PBa_KOV7MtVPWQ前...

2022-10-24 22:51:29查看全文 >>

深拷贝和浅拷贝的简单理解(深拷贝解决浅拷贝的问题)

深拷贝和浅拷贝的简单理解(深拷贝解决浅拷贝的问题)

前言平时我们从数据库查询出 po 对象,要返回给前端时,会有另一个对象 vo,此时我们需要将 po 的值复制给 vo,如...

2022-10-24 22:07:09查看全文 >>

文档排行