JavaScript:解构赋值中剩余元素是否创建了一个新数组?

问题描述 投票:0回答:1

我想知道使用剩余元素(无论是对象还是数组)的数组解构语法是否会在内存中创建一个新数组,然后由嵌套剩余元素的解构赋值使用?换句话说,我想知道语法是否如下:

let [a, b, ...[c, d]] = [1, 2, 3, 4];`

导致在初始化

a
b
后创建一个新数组以供
...[c , d]
解构然后使用?

我在 MDN 的“使用绑定模式作为其余属性”部分中询问关于 解构赋值 的内容:

数组解构赋值的剩余属性可以是另一个数组或对象绑定模式。内部解构对收集其余元素后创建的数组进行解构,因此您无法以这种方式访问原始可迭代对象上存在的任何属性。

这是关于我上面给出的例子。最后一句指出“来自收集其余元素后创建的数组”,这似乎表明正在为该解构创建一个全新的数组?

我对此主要好奇的是性能。创建一个新数组(或可迭代)似乎很慢,所以我想知道这是否是通过其他方式实现或指定的?我已阅读该规范(链接在上述 MDN 页面的“规范”下),但仍然有这个问题。我还使用 JSBench.me 进行了性能测试,这似乎表明使用解构语法而不是不使用(例如,我上面的示例而不是仅仅

let [a, b, c, d] = [1, 2, 3, 4];

)慢了 90% 以上。

javascript arrays destructuring object-destructuring rest-parameters
1个回答
0
投票

是的,解构中的剩余语法创建了一个数组。如果您立即再次解构它,则您的代码无法观察到它,因此理论上引擎可以优化中间分配而无需更改代码的行为。然而,这种不寻常的模式不太可能得到很好的优化,它不应该出现在惯用的代码中。

© www.soinside.com 2019 - 2024. All rights reserved.