JavaScript 数组扩展语法的运行时复杂度是多少?

Mak*_*sym 2 javascript algorithm performance ecmascript-6

假设我想使用数组扩展语法复制现有数组,如下所示:

const a = [1, 2, 3, ..., n];
const b = [...a]
Run Code Online (Sandbox Code Playgroud)

的运行时复杂度是多少const b = [...a]?我似乎找不到任何相关信息。

T.J*_*der 5

从理论上讲,它需要一点前期成本,然后是线性的(假设是标准数组迭代器,而不是自定义的东西),因为理论上它是一个消耗数组中迭代器的循环,如下所示:

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
for (const element of a) {
    b[b.length] = element;
}
console.log(b);
Run Code Online (Sandbox Code Playgroud)

反过来,这实际上是:

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
{
    const it = a[Symbol.iterator]();
    let result;
    while (!(result = it.next()).done) {
        const element = result.value;
        b[b.length] = element;
    }
}
console.log(b);
Run Code Online (Sandbox Code Playgroud)

(在这种特定[...a]情况下,即使进行最小程度的优化,JavaScript 引擎也可能能够消除迭代器开销并使其变得简单线性,就像a.slice()本来的那样。)

即使由 JavaScript 引擎优化(例如,如果它位于代码中的热点),也不清楚它如何能比线性做得更好,因为即使是 memcopy 操作也是线性的。

我说“假设标准数组迭代器”是因为并非所有迭代器都一定是线性的。标准数组迭代器是线性的,但这并不意味着所有迭代器都是线性的。

  • …当然,如果您碰巧有一个迭代器,它每一步都会增加工作量(例如,计算素数),那么它将高于线性。OP 特别询问了有关复制数组的问题,对于这些来说,它绝对是线性的。 (2认同)