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]?我似乎找不到任何相关信息。
从理论上讲,它需要一点前期成本,然后是线性的(假设是标准数组迭代器,而不是自定义的东西),因为理论上它是一个消耗数组中迭代器的循环,如下所示:
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 操作也是线性的。
我说“假设标准数组迭代器”是因为并非所有迭代器都一定是线性的。标准数组迭代器是线性的,但这并不意味着所有迭代器都是线性的。