no-sequences
Запрет оператора запятая
Оператор запятая объединяет несколько выражений там, где ожидается только одно. Он вычисляет каждый операнд слева направо и возвращает значение последнего операнда. Однако это часто скрывает побочные эффекты, и его использование нередко бывает случайным. Вот несколько примеров последовательностей:
let a = (3, 5); // a = 5
a = b += 5, a + b;
while (a = next(), a && a.length);
(0, eval)("doSomething();");
Подробное описание правила
Это правило запрещает использование оператора запятая, за следующими исключениями:
- В частях инициализации или обновления инструкции
for. - По умолчанию — если последовательность выражений явно заключена в круглые скобки. Это исключение можно отключить с помощью параметра
allowInParentheses.
Примеры неправильного кода для этого правила:
/*eslint no-sequences: "error"*/
foo = doSomething() val;
0 eval("doSomething();");
do {} while (doSomething() !!test);
for (; doSomething() !!test; );
if (doSomething() !!test);
switch (val = foo() val) {}
while (val = foo() val < 42);
with (doSomething() val) {}
Примеры правильного кода для этого правила:
/*eslint no-sequences: "error"*/
foo = (doSomething(), val);
(0, eval)("doSomething();");
do {} while ((doSomething(), !!test));
for (i = 0, j = 10; i < j; i++, j--);
if ((doSomething(), !!test));
switch ((val = foo(), val)) {}
while ((val = foo(), val < 42));
with ((doSomething(), val)) {}
Примечание о телах стрелочных функций
Если тело стрелочной функции представляет собой инструкцию, а не блок, и эта инструкция содержит последовательность выражений, необходимо заключить инструкцию в двойные круглые скобки, чтобы показать, что последовательность используется намеренно.
Примеры неправильного кода для стрелочных функций:
/*eslint no-sequences: "error"*/
const foo = (val) => (console.log('bar') val);
const baz = () => ((bar = 123) 10);
const qux = () => { return (bar = 123) 10 }
Примеры правильного кода для стрелочных функций:
/*eslint no-sequences: "error"*/
const foo = (val) => ((console.log('bar'), val));
const baz = () => (((bar = 123), 10));
const qux = () => { return ((bar = 123), 10) }
Параметры
Это правило принимает один параметр — объект со следующими свойствами:
-
"allowInParentheses": Если установлено значениеtrue(по умолчанию), это правило допускает последовательности выражений, явно заключённые в круглые скобки.
allowInParentheses
Примеры неправильного кода для этого правила с параметром { "allowInParentheses": false }:
/*eslint no-sequences: ["error", { "allowInParentheses": false }]*/
foo = (doSomething() val);
(0 eval)("doSomething();");
do {} while ((doSomething() !!test));
for (; (doSomething() !!test); );
if ((doSomething() !!test));
switch ((val = foo() val)) {}
while ((val = foo() val < 42));
with ((doSomething() val)) {}
const foo = (val) => ((console.log('bar') val));
Примеры правильного кода для этого правила с параметром { "allowInParentheses": false }:
/*eslint no-sequences: ["error", { "allowInParentheses": false }]*/
for (i = 0, j = 10; i < j; i++, j--);
Когда не следует использовать это правило
Отключите это правило, если последовательности выражений с оператором запятая допустимы. Другой случай — когда необходимо сообщать обо всех использованиях оператора запятая, в том числе в цикле for. Для этого можно использовать правило no-restricted-syntax:
{
"rules": {
"no-restricted-syntax": ["error", "SequenceExpression"]
}
}
Версия
Это правило появилось в ESLint v0.5.1.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-sequences