跳至内容

oxc/no-accumulating-spread Perf

其作用

防止在 Array.prototype.reduce() 和循环中对累加器使用对象或数组扩展。

为什么这样不好?

对象和数组扩展会在每次迭代时创建一个新对象或数组。在最坏的情况下,它们还会导致 O(n) 次复制(内存和时间复杂度均为 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 许可下发布。