no-unexpected-multiline
禁止令人困惑的多行表达式
✅ 推荐
在 配置文件 中使用来自 @eslint/js
的 recommended
配置启用此规则。
由于自动分号插入 (ASI),JavaScript 中的分号通常是可选的。您可以使用 semi 规则来要求或禁止分号。
ASI 的规则相对简单:正如 Isaac Schlueter 曾经描述的那样,换行符总是结束语句,就像分号一样,**除了**以下情况之一为真:
- 语句包含未闭合的括号、数组字面量或对象字面量,或者以其他不是结束语句的有效方式结束。(例如,以
.
或,
结束。) - 该行是
--
或++
(在这种情况下,它将递减/递增下一个标记。) - 它是
for()
、while()
、do
、if()
或else
,并且没有{
- 下一行以
[
、(
、+
、*
、/
、-
、,
、.
或其他只能在单个表达式中的两个标记之间找到的二元运算符开头。
在换行符**不**结束语句的例外情况下,遗漏分号的打字错误会导致两行不相关的连续行被解释为一个表达式。特别是对于不使用分号的编码风格,读者可能会忽略这个错误。虽然语法上正确,但代码在执行时可能会抛出异常。
规则详情
此规则禁止令人困惑的多行表达式,其中换行符看起来像是结束语句,但实际上并非如此。
此规则**错误**代码示例
在游乐场中打开
/*eslint no-unexpected-multiline: "error"*/
var foo = bar
1 || 2).baz();
var hello = 'world'
1, 2, 3].forEach(addNumber);
let x = function() {}
hello`
let y = function() {}
y
hello`
let z = foo
regex/g.test(bar)
此规则**正确**代码示例
在游乐场中打开
/*eslint no-unexpected-multiline: "error"*/
var foo = bar;
(1 || 2).baz();
var foo = bar
;(1 || 2).baz()
var hello = 'world';
[1, 2, 3].forEach(addNumber);
var hello = 'world'
void [1, 2, 3].forEach(addNumber);
let x = function() {};
`hello`
let tag = function() {}
tag `hello`
何时不使用它
如果您确信不会意外引入类似的代码,则可以关闭此规则。
请注意,semi 规则**不会**标记为问题的模式。
相关规则
版本
此规则是在 ESLint v0.24.0 中引入的。