我想知道使用剩余元素(无论是对象还是数组)的数组解构语法是否会在内存中创建一个新数组,然后由嵌套剩余元素的解构赋值使用?换句话说,我想知道语法是否如下:
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% 以上。
是的,解构中的剩余语法创建了一个数组。如果您立即再次解构它,则您的代码无法观察到它,因此理论上引擎可以优化中间分配而无需更改代码的行为。然而,这种不寻常的模式不太可能得到很好的优化,它不应该出现在惯用的代码中。