oxc/no-accumulating-spread 效能
功能
防止在 Array.prototype.reduce()
和迴圈中使用物件或陣列展開運算子於累加器。
為什麼這是不好的?
物件和陣列展開運算子會在每次迭代時建立新的物件或陣列。在最壞的情況下,它們也會導致 O(n) 的複製(記憶體和時間複雜度皆然)。當用於累加器時,這可能會導致 O(n^2)
的記憶體複雜度和 O(n^2)
的時間複雜度。
如需更深入的說明,請參閱 Prateek Surana 的這篇部落格文章。
範例
此規則的不正確程式碼範例
javascript
arr.reduce((acc, x) => ({ ...acc, [x]: fn(x) }), {});
Object.keys(obj).reduce((acc, el) => ({ ...acc, [el]: fn(el) }), {});
let foo = [];
for (let i = 0; i < 10; i++) {
foo = [...foo, i];
}
此規則的正確程式碼範例
javascript
function fn(x) {
// ...
}
arr.reduce((acc, x) => acc.push(fn(x)), []);
Object.keys(obj).reduce((acc, el) => {
acc[el] = fn(el);
}, {});
// spreading non-accumulators should be avoided if possible, but is not
// banned by this rule
Object.keys(obj).reduce((acc, el) => {
acc[el] = { ...obj[el] };
return acc;
}, {});
let foo = [];
for (let i = 0; i < 10; i++) {
foo.push(i);
}