no-unexpected-multiline
不允許造成混淆的多行表達式
✅ 建議
在設定檔中使用 @eslint/js
的 recommended
設定會啟用此規則
由於自動分號插入 (ASI),分號在 JavaScript 中通常是可選的。您可以使用 semi 規則要求或禁止分號。
ASI 的規則相對簡單:正如 Isaac Schlueter 曾經描述的那樣,換行符號總是結束一個語句,就像分號一樣,除非以下情況之一成立
- 該語句有一個未關閉的括號、陣列文字或物件文字,或者以其他不是結束語句的有效方式結束。(例如,以
.
或,
結尾。) - 該行是
--
或++
(在這種情況下,它將遞減/遞增下一個 token。) - 它是
for()
、while()
、do
、if()
或else
,並且沒有{
- 下一行以
[
、(
、+
、*
、/
、-
、,
、.
或其他只能在單一表達式中的兩個 token 之間找到的二元運算子開頭。
在換行符號不結束語句的例外情況下,因打字錯誤而省略分號會導致兩個不相關的連續行被解釋為一個表達式。特別是對於沒有分號的程式碼風格,讀者可能會忽略這個錯誤。雖然語法上正確,但程式碼在執行時可能會拋出例外。
規則詳情
此規則不允許造成混淆的多行表達式,其中換行符號看起來像是結束了一個語句,但事實並非如此。
此規則的不正確程式碼範例
在線上編輯器中開啟
/*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 中引入的。