我想知道在JavaScript中使用带有数组的spread的时间复杂度是多少。是线性 O(n) 还是常数 O(1)?
语法示例如下:
let lar = Math.max(...nums)
Spread 调用相关对象的[Symbol.iterator]
属性。对于数组,这将遍历数组中的每个项目,调用数组迭代器的.next()
,直到迭代器耗尽,从而导致O(N)
的复杂性。
出于完全相同的原因,for..of
(也称为[Symbol.iterator]
)循环也O(N)
:
const arr = [1, 2, 3];
for (const item of arr) {
console.log(item);
}
有关实时示例,请参阅执行以下代码片段如何花费一些时间:
const arr = new Array(3e7).fill(null);
const t0 = performance.now();
const arr2 = [...arr];
console.log(performance.now() - t0);
(如果操作是O(1)
的,它将接近瞬时,但事实并非如此)
参数扩展与数组扩展不同,但它使用相同的操作(遍历可迭代对象,直到用尽),因此具有相同的复杂性。
对于函数调用:
myFunction(...iterableObj);