跳至內容

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);
}

參考資料

在 MIT 許可下發布。