unicorn/no-useless-spread 正确性
作用
禁止在以下不必要的情况下使用展开语法
- 展开数组文字作为数组文字的元素
- 展开数组文字作为调用或
new
调用的参数 - 展开对象文字作为对象文字的属性
- 使用展开语法克隆内联创建的数组
为什么这不好?
以下内置项接受可迭代对象,因此不必将可迭代对象转换为数组
Map
构造函数WeakMap
构造函数Set
构造函数WeakSet
构造函数TypedArray
构造函数Array.from(…)
TypedArray.from(…)
Promise.{all,allSettled,any,race}(…)
Object.fromEntries(…)
for…of
循环可以迭代任何可迭代对象,而不仅仅是数组,因此不必将可迭代对象转换为数组。yield*
可以委托给其他可迭代对象,因此不必将可迭代对象转换为数组。
示例
javascript
const array = [firstElement, ...[secondElement], thirdElement];
const object = { firstProperty, ...{ secondProperty }, thirdProperty };
foo(firstArgument, ...[secondArgument], thirdArgument);
const object = new Foo(firstArgument, ...[secondArgument], thirdArgument);
const set = new Set([...iterable]);
async function foo() {
const results = await Promise.all([...iterable]);
}
for (const foo of [...set]);
function* foo() {
yield* [...anotherGenerator()];
}
function foo(bar) {
return [...bar.map((x) => x * 2)];
}
// Pass
const array = [firstElement, secondElement, thirdElement];
const object = { firstProperty, secondProperty, thirdProperty };
foo(firstArgument, secondArgument, thirdArgument);
const object = new Foo(firstArgument, secondArgument, thirdArgument);
const array = [...foo, bar];
const object = { ...foo, bar };
foo(foo, ...bar);
const object = new Foo(...foo, bar);
const set = new Set(iterable);
async function foo() {
const results = await Promise.all(iterable);
}
for (const foo of set);
function* foo() {
yield* anotherGenerator();
}
function foo(bar) {
return bar.map((x) => x * 2);
}