首先應該知道哪些語句會用到自動插入分號(automatic semisolon insertion, asi):
- 空語句
-var
語句
- 表示式
-do-while
語句
-continue
語句
-break
語句
-return
語句
-throw
語句
asi的具體規則,在此規範中描述:§11.9.1 rules of automatic semicolon insertion
描述了三個示例:
1.如果遇到語法不允許的token(行終結符
或}
),將在它前面插入乙個分號:
- token被至少乙個行終結符
與前面的token分開
- 這個token是}
例如:
3
被轉換成:
3;
數值 1
遇到第一種情況,其隨後的token是乙個行終結符。2
遇到第二種情況,其隨後的token是}
.
2.當遇到token的輸入流的末尾並且解析器不能將輸入的token流解析成乙個單獨完整的程式,然後乙個分號就會被自動插入到輸入流的末尾。
例如:
a =b
++c
被轉換成:
a =b;
++c;
3.這種情況是發生在,當語法的某些產生式使得token合法時,且產生式是有條件限制的產生式,在被限制的token之前會自動插入分號。
有條件限制的產生式:
updateexpression :
lefthandsideexpression [no lineterminator here] ++
lefthandsideexpression [no lineterminator here] --
continuestatement :
continue ;
continue [no lineterminator here] labelidentifier ;
breakstatement :
break ;
break [no lineterminator here] labelidentifier ;
returnstatement :
return ;
return [no lineterminator here] expression ;
throwstatement :
throw [no lineterminator here] expression ;
arrowfunction :
arrowparameters [no lineterminator here]=> concisebody
yieldexpression :
yield [no lineterminator here] * assignmentexpression
yield [no lineterminator here] assignmentexpression
return語句
的乙個典型的例子,
return
"something";
被轉換成:
return;
"something";
Go語言小細節 分號自動插入規則
為了允許一條複雜語句完全顯示在乙個 行中,分號可能被插入在乙個右小括號 或者右大括號 之前 package main funcf bool func main 以上 列印出的結果為 true 原因就是,go 語言的分號自動插入規則導致的,當我們將分號補齊後,再看看 結構 package main f...
JS分號自動插入的ASI機制
規範理論 es5 標準定義了自動分號插入規則,包括以下三個基本規則加兩個前置條件 前置條件 1 如果插入分號後解析結果是空語句,那麼不會自動插入分號。例子 空語句,else 前不加分好 if a b else c d 2 如果插入分號後它成為 for 語句頭部的兩個分號之一,那麼不會自動插入分號。例...
JS傳遞陣列自動以分號分隔
今天在家做公司的專案,遇到乙個很奇怪的事,其中js傳遞陣列時,傳遞過去的資料會以,分號 分隔。如下 function expertopinion var url servlet makescoreaction var paras iditem iditem idoperate idoperate o...