# no-sequences

禁止逗号运算符

逗号运算符包含多个表达式,其中只需要一个。它从左到右计算每个操作数并返回最后一个操作数的值。然而,这经常掩盖副作用,并且它的使用通常是一个意外。以下是一些序列示例:

var 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 foo = () => ((bar = 123), 10);

const foo = () => { return (bar = 123), 10 }

箭头函数的正确代码示例:

/*eslint no-sequences: "error"*/
const foo = (val) => ((console.log('bar'), val));

const foo = () => (((bar = 123), 10));

const foo = () => { 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"]
    }
}
Last Updated: 5/13/2023, 8:55:38 PM