编程语言
首页 > 编程语言> > javascript – 为什么spread元素不适合复制多维数组?

javascript – 为什么spread元素不适合复制多维数组?

作者:互联网

来自mdn:Spread Syntax

Note: Typically the spread operators in ES2015 goes one level deep while copying an array. Therefore, they are unsuitable for copying multidimensional arrays. It’s the same case with Object.assign() and Object spread syntax. Look at the example below for a better understanding.

var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift(); // 1
// Now array b is: [[2], [3]]

上述陈述的重点是什么?上面的代码示例的工作方式与使用.slice()方法将数组复制到a中的方法相同.我尝试在这里为数组添加另一个维度:https://repl.it/HKOq/2并且事情仍然按预期工作.

那么为什么扩展语法不适合复制多维数组呢?

我很感激任何帮助.

编辑:

通过estus和vol7ron阅读答案帮助我解决问题.基本上,正如estus在技术上指出的那样,数组内部只有数组而不是多维数组.

并且正如vol7ron所解释的那样,只复制了数组的第一级,因此内存中的对象对于任何其他嵌套元素保持相同.

怀疑使用扩展语法的行为与切片运算符的行为有所不同,我也错了

解决方法:

数组是对象,[…]创建数组对象的浅表副本.

对于语言本身,没有多维数组 – 数组中有另一个数组.包含数组,普通对象,函数或基元是无关紧要的.对于基元,将复制它们的值.否则,将复制对象的引用.这是什么

It’s the same case with Object.assign() and Object spread operators

部分是指.

关于

The above code sample works just the same as if you’d copied the array in a to b using the .slice() method

……确实如此.这是编写a.slice()或[] .concat(a)的更简洁的方法.有一个相当大的例外. ES6 rest运算符(以及Array.from(a))对所有迭代都同样有效,而不仅仅适用于数组.

对于对象的深层副本,ES6不提供任何新内容,应该手动递归地复制对象(数组).为了解决所有问题,使用经过验证的第三方帮助函数仍然是有意义的,例如Lodash cloneDeep.

标签:spread-syntax,javascript,arrays,ecmascript-6
来源: https://codeday.me/bug/20191008/1871722.html