国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

javascript 分號總結(jié)及詳細介紹

2024-05-06 16:32:06
字體:
供稿:網(wǎng)友

javascript每條語句都是以分號結(jié)束,但由于javascript具有分號自動插入規(guī)則,所有不同的編程人員有不同的習(xí)慣,有的加分號,有的不加分號,那么到底加分號好還是不加分號好?本文章向大家探討javascript每條語句該不該加分號。

javascript的分號代表語句的結(jié)束符,但由于javascript具有分號自動插入規(guī)則,所以它是一個十分容易讓人模糊的東西,在一般情況下,一個換行就會產(chǎn)生一個分號,但實際情況卻不然,也就是說在javascript中換行可能產(chǎn)生分號,也可能不產(chǎn)生,是否自動插入分號,主要看上下行。所以即使是經(jīng)驗豐富的程序員,有時候也會頭大。

JavaScript自動加分號規(guī)則:

  1. 當有換行符(包括含有換行符的多行注釋),并且下一個token沒法跟前面的語法匹配時,會自動補分號。
  2. 當有}時,如果缺少分號,會補分號。
  3. 當程序源代碼結(jié)束時,如果缺少分號,會補分號。

接下來我們來分組看不加分號導(dǎo)致的語法歧義:

第一種是++和--兩種運算符出現(xiàn)在上一行結(jié)尾的情況,下一行以以下開頭時,會產(chǎn)生語法歧義: 
function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ ! 
其中,function和delete是非常常用的statement開頭。
特別是 ++和--單獨被斷為一行的時候,因為JS的語法規(guī)則規(guī)定后自增運算不允許中間插入換行,所以++和--會被視為前自增而跟下一行連接在一起。

第二種是return作為上一行結(jié)尾的情況,下一行以以下開頭時,會產(chǎn)生語法歧義:
function delete void typeof ( [ { Identifier ++ -- + - ~ !

同樣因為JS語法的規(guī)則不允許在return 和后面的值之間插入換行,所以return之后只要有換行符就會視為有分號,這常常會與使用者的期望不符合。

第三種是下一行以+和-開頭的情況,上一行以以下結(jié)尾是,會產(chǎn)生語法歧義:
-- ++ IdentifierName ] ) } RegularExpressionLiteral

因為很少有語句以+或者-開頭,所以這種情況不算危險。

第四種是上一行以break、continue結(jié)尾的情況,下一行以Identifier開頭時,會產(chǎn)生語法歧義。

第五種是下一行以(和[開頭的情況,上一行以以下結(jié)尾是,會產(chǎn)生語法歧義:
-- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this 
這種情況非常危險(所以hax的文章中要提出這種情況應(yīng)該語句前寫分號),幾乎上一行的所有情況都將導(dǎo)致正常期望之外的結(jié)果。

第六種是,當下一行以RegularExpressionLiteral 開頭的情況,上一行的以下結(jié)尾,會導(dǎo)致/被理解為除號:
-- ++ IdentifierName ] ) }  RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this

實踐出真理,看一下下面這些例子,就明白,分號自動插入不是那么好讓人捉摸的。稍微不注意就會讓你頭大。

return引起的血案:

function test(){  var a = 1;  var b = 2;  return //會自動插入分號    (     a+b    )};alert(test());

一個返回a+b值的函數(shù),初看沒任何問題,但運行alert的結(jié)果卻是undefined。根據(jù)分號的自動插入規(guī)則,return 語句后面如果有換行就會自動插入分號,沒有返回值也就比較好理解了。如果需要換行的話,可以這樣:

function test(){  var a = 1;  var b = 2;  return (       a+b     )};alert(test());

兩個閉包引起的血案:

(function (){ var a;})() //不會自動插入分號(function (){ var b;})()

很詭異,解釋不了,誰能告訴我~

for語句頭中的兩個分號,不自動插入分號

for( var a=1,b=10 //不會自動插入分號     a<b //不會自動插入分號     a++   ){}

總結(jié)

  1. 在return、break、continue、后自增、后自減五種語句中,換行符可以完全替代分號的作用。
  2. var if do while for continue break return with switch throw try debugger幾種關(guān)鍵字開頭的語句,以及空語句,上一行加不加分號影響不大。
  3. 凡表達式語句和函數(shù)表達式語句,后面不加分號非常危險,情況極其復(fù)雜。
  4. 凡(和[開頭的語句,前面不加分號極度危險。

以上就是對JavaScript 分號的資料整理,后續(xù)繼續(xù)補充相關(guān)資料,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巍山| 五台县| 新宾| 葫芦岛市| 葫芦岛市| 府谷县| 内丘县| 营口市| 南安市| 陆丰市| 陆河县| 边坝县| 长阳| 郴州市| 泰宁县| 阿勒泰市| 六枝特区| 澄迈县| 团风县| 南澳县| 清水河县| 大荔县| 辽宁省| 临桂县| 达尔| 红桥区| 满洲里市| 广昌县| 河源市| 连州市| 枣庄市| 桐庐县| 新闻| 宜城市| 庄河市| 丹巴县| 陆良县| 民乐县| 鹤岗市| 黑龙江省| 安福县|