类别:媒体报道 发布时间:2021-01-07 浏览人次:
有两种数组拷贝类型:浅拷贝 深拷贝。浅拷贝只会拷贝数组的第一层,剩下的会引用。如果你需要一个嵌套的数组的拷贝,那需要你去深度拷贝这个数组。深拷贝,选择JSON方法或者Lodsh库吧
const numbers = [1, [2], [3, [4]], 5]; // Using JavaScript JSON.parse(JSON.stringify(numbers)); // Using Lodash _.cloneDeep(objects);
数组是引用类型
为了搞清楚为什么有两种类型的拷贝,我们来深度了解一下基础知识然后解释什么是引用类型。
与原始类型(number、string)不同,数组是引用类型。这意味着当你把一个数组赋值给一个变量,你是将数组的内存地址而非数组本身赋给变量。
拷贝值类型
这里没什么大不了的,我们创建一个value的拷贝。当我们改变valueCopy的值,它不会影响原来的value值。同理,当我们改变原来的值它也不会影响拷贝后的值。很好
let value = 3; let valueCopy = value; // create copy console.log(valueCopy); // 3 // Change valueCopy valueCopy = 100 console.log(valueCopy); // 100 // Original NOT affected console.log(value); // 3
拷贝引用类型
好的,这里就会有点奇怪了!我们用同样的方法拷贝数组。
let array = [1,2,3]; let arrayCopy = array; // create copy console.log(arrayCopy); // [1,2,3]; // Change 1st element of the array arrayCopy[0] = ' '; console.log(arrayCopy); // [ ' ', 2, 3 ] // Original got affected console.log(array); // [ ' ', 2, 3 ]
为什么原来的数组也受到了影响呢?好了,是因为:你拷贝的不是你拷贝的。说人话,意思就是你拷贝的只是指向数组内存空间的指针。引用类型不包含值,它们是指向内存中值的指针。
拷贝引用类型的方法
解决方法就是拷贝值而不是指针。
let array = [1,2,3]; let arrayCopy = [...array]; // create TRUE copy console.log(arrayCopy); // [1,2,3]; // Change 1st element of the array arrayCopy[0] = ' '; console.log(arrayCopy); // [ ' ', 2, 3 ] // Original NOT affected console.log(array); // [ 1, 2, 3 ]
浅 深 拷贝
当我使用展开扩展符号...来拷贝一个数组,我只是浅拷贝了一个数组。如果数组是嵌套或者多维的,这就不奏效了。
let nestedArray = [1, [2], 3]; let arrayCopy = [...nestedArray]; // Make some changes arrayCopy[0] = ' '; // change shallow element arrayCopy[1][0] = ' '; // change nested element console.log(arrayCopy); // [ ' ', [ ' ' ], 3 ] // Nested array got affected console.log(nestedArray); // [ 1, [ ' ' ], 3 ]
如上,浅拷贝首层数组表现良好,然而,更改了嵌套数组元素,原始数组也受到影响 。为了解决这个问题,就要用到深拷贝了。
let nestedArray = [1, [2], 3]; let arrayCopy = JSON.parse(JSON.stringify(nestedArray)); // Make some changes arrayCopy[0] = ' '; // change shallow element arrayCopy[1][0] = ' '; // change nested element console.log(arrayCopy); // [ ' ', [ ' ' ], 3 ] // Nested array NOT affected console.log(nestedArray); // 1, [ 2 ], 3 ]
所以,这就完事了吗?要不要手写一个深拷贝引用类型的方法?
const deepClone = obj = { const isObject = args = (typeof args === 'object' || typeof args === 'function') typeof args !== null if (!isObject) throw new Error('Not Reference Types') let newObj = Array.isArray(obj) [...obj] : { ...obj } Reflect.ownKeys(newObj).map(key = { newObj[key] = isObject(obj[key]) deepClone(obj[key]) : obj[key] return newObj }
文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
如何应用javascript深层复制一数量组 一般状况下,应用 “=” 能够完成取值。但针对数字能量数组、目标、涵数等这种引入种类的数据信息,这一标记也不管用了。下边大家来详尽...
2021-01-07Vue中完成管理权限操纵的方式实例 本文关键详细介绍了Vue中完成管理权限操纵的方式实例,网编感觉挺好的,如今共享给大伙儿,也给大伙儿做下参照。一起追随网编回来看一下...
2021-01-07不久前跟大伙儿详细介绍了微信小程序调节专用工具,开展就运用调节专用工具来和大伙儿演试一下微信小程序真机调节实例教程,期待对大伙儿有一定的协助。 1.开启手机微信微信小...
2021-01-07制作网页的一些加速方式 : :00 顾客必须迅速载入的网站,并再次无落后地出示內容,假若网站能够考虑这类要求,客户能够自然不容易因为速率而舍弃网站,这儿来谈一谈制作网页的...
2021-01-07招聘人数:10职位信息一、岗位职责:1、作为阿里巴巴国际事业部在广东广州市花都区、白云区、从化区、广东清远市、广东韶关市的地面销售团队,代表阿里巴巴国际站()开展供应商...
2021-01-07招聘人数:18职位信息1.负责已合作企业的售后服务:对接企业的需求,解决企业遇到的问题以及处理投诉等。2.负责已经合作企业客户维护工作,包括现场运营管理、现场设备管理、用...
2021-01-07