摘要:但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构臧三小明小芳我们会发现打印出的结果如下上图可看出的结果均变了,这并不是我们想要的结果,所以我们要用到深拷贝。
一个项目开发中经常会用到需要复制一个对象或者数组,但是却不能改变原始对象,所以就要用到拷贝,拷贝又分深拷贝和浅拷贝,今天列举一下几种拷贝形式。
一、浅拷贝 (1) Object.assign()Object.assign我们经常会用到合并对象,当然利用Object.assign性质我们也可以实现对象的拷贝。
var obj1 = {a: 1, b: 2} var obj2 = Object.assign({}, obj1) obj2.a = 4 console.log(obj1, obj2)
结果如图:
这里要注意的是Object.assign第一个参数必须是个空对象
(2) 解构赋值var obj1 = {a: 1, b: 2} var obj2 = {...obj1} obj2.a = 4 console.log(obj1, obj2)
结果如图:
这里一样可以实现之前上面的结果。
但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构
var obj1 = [{ name: "臧三", childs: ["小明", "小芳"] }] var obj2 = [...obj1] obj2[0].childs = [] console.log(obj1, obj2)
我们会发现打印出的结果如下:
上图可看出obj1,obj2 的结果均变了,这并不是我们想要的结果,所以我们要用到深拷贝。
二、深拷贝 (1) 利用json.stringifyvar obj1 = [{ name: "臧三", childs: ["小明", "小芳"] }] var obj2 = JSON.parse(JSON.stringify(obj1)) obj2[0].childs = [] console.log(obj1, obj2)
结果如下:
这样的话就能达到我们想要的结果。
这种方法简单,但也有弊端,看看下面的数据结构:
var obj1 = [{ name: "臧三", childs: ["小明", "小芳"], fn: function() {}, age: undefined }] var obj2 = JSON.parse(JSON.stringify(obj1)) obj2[0].childs = [] console.log(obj1, obj2)
结果:
我们从结果中发现,值为undefined,或者function的时候并不会拷贝过来。
(2) 利用递归来实现一个方法进行拷贝var obj1 = [{ name: "臧三", childs: ["小明", "小芳"], fn: function() {}, age: undefined }] var obj2 = extend(obj1) obj2[0].childs = [] console.log(obj1, obj2) function extend(data) { if (typeof data === "object" && data) { let val = typeof data.length === "number" ? [] : {} for(let i in data) { val[i] = extend(data[i]) } return val } else { return data } }
结果:
这样我们就能把所有值都拷贝过来。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/103224.html
摘要:拷贝分为浅拷贝和深拷贝。浅拷贝是引用复制,深拷贝是完全单纯拷贝数据的值。所以,这种方法只是简单绕过第一层箱子的引用复制深拷贝目前比较好的方法就是大法,要么就是自己写递归的深拷贝函数。附带深拷贝的自定义函数源自大佬的 经常遇到数组或对象等引用类型作为函数的参数的情况,但又不想修改原来的数据,这时候就需要拷贝(基本类型的变量不需要考虑)。拷贝分为浅拷贝和深拷贝。浅拷贝是引用复制,深拷贝是完...
摘要:方法一老老实实敲代码法迭代法,适用于所有方法二利用将对象序列化字符串,再使用来反序列化还原对象缺点如果里面有时间对象,则后再的结果,时间将只是字符串的形式。简而言之,第一层实现了深度拷贝,后续层次还是浅拷贝 方法一 老老实实敲代码法(迭代法,适用于所有) function deepClone(obj) { let newObj = Array.isArray(obj) ? [...
阅读 2949·2021-11-24 09:39
阅读 2857·2021-09-29 09:34
阅读 3549·2021-09-24 10:23
阅读 1731·2021-09-22 15:41
阅读 1690·2019-08-30 15:55
阅读 3506·2019-08-30 13:58
阅读 2614·2019-08-30 13:11
阅读 1661·2019-08-29 12:31