程式語言的詞法結構是一套基礎性的規則,用來描述你如何寫這門語言。作為語法的基礎,它規定了變數名稱是怎麼樣的,如何寫註釋,以及語句之間是如何區分的。本節用很短的篇幅來介紹javascript的詞法結構。
1.字符集
javascript程式是用Unicode字元集寫的,Unicode是ASCII和Latin-1的超集,並支援地區上幾乎所有的語言。 ECMAscript3要求javascript的實作必須支援Unicode2,1及後續版本,ECMAscript5則要求支援Unicode3及後續版本
i.區分大小寫
javascript是區分大小寫的語言,也就是說關鍵字、變數、函數名稱和所有的表述字元都必須採用一致的大小寫 ,例如關鍵字while必須寫成while,不能寫成While或WHILE。
但要注意的是html並沒有區分大小寫(儘管xhtml區分),由於它和客戶端javascript聯繫緊密,因此很容易混淆。例如在html設定的處理事件中,onclick屬性可以寫成onClick,但在javascript中寫寫成小寫的onclick。
ii空格、換行符、和格式控制器
javascript會忽略程式中的標示(token)之間的空格,多數情況下,javascript同樣會忽略換行符。由於可以在程式碼中隨意使用空格和換行符,一次可以採用整齊和一致的縮進來形成統一的編碼風格,提高程式碼的可讀性。
javascript除了辨識空格符(u0020)。 javascript也師表如下標示空格的字元:水平製表符(u0009)、垂直製表符(u000B)、換頁符(u000C)、不中斷空白符號(u00A0)、位元組序標記(uFEFF),以及在Unicode中所有Zs類別的字元。 javascript將以下字元辨識為結束符號:換行符號(u000A),回車符號(u000D),行分隔符號(u2028),段分隔符號(u2029)。回車符加換行符在一起唄解析為一個單行的結束符。
Unicode格式控製字元(Cf類),例如「從右至左書寫標記」(u200F)和從「從左到右書寫標記」(u200E),控制著文字的視覺顯示。這對一些非英語文本的正確顯示來說是至關重要的,這些字符可以在javascript的註釋,字符串直接量和正則表達式直接量中,但不能用在標示符(比如,變量名)中,但有個例外零寬連接符號(u200D)和零寬非連接符號(uFEFF)是可以出現在標示符中,但不能作為標識符的手字元。上文也提到了,字節序標記格式控制符(uFEFF)被當成了空格來對待
iii.Unicode轉義序列
在有些電腦硬體和軟體裡,無法顯示或輸入Unicode字元全集。為了支援哪些使用老舊技術的程式設計師,javascript定義了一種特殊序列,使用6個ASCII字元來代表任意16位元的Unicode內碼。這些Unicode轉義序列以u為前綴,其後跟隨十六進位鼠(使用數字以及大小寫字母A-F表示)。這種Unicode轉義寫法可以用在javascript字串直接量、正規表示式之江路和標示符中(關鍵字除外)。例如字元é的Unicode轉義寫法為u00E9,如下兩個Javascript字串完全是一樣的。
"café" === "cafu00e9" => true
Unicode轉義寫法可以出現在註解中,但由於javascript會將註解忽略,他們只是被當成成上下文中的ascii字元處理,並不會接下到對於的Unicode字元
iiii標準化
Unicode允許使用多種方法對同一個字元進行編碼。例如字元é可以使用Unicode字元u00E9,也可以使用普通的ascii字元e跟隨一個語調符號u0301 ,在文字編輯器中,這兩個編碼顯示的結果是一摸一樣的,但是它們的二進位編碼表示是不一樣的,在計算機裡也不相等。 Unicode標準為索引字元定義了一個首選的程式碼格式,並給出了一個標準化的處理方式將文字轉換為適合比較的標準格式,不會再對其它表示、字串或正規表示式做標準化處理。
2.註
javascript支援兩種註解方式,在行尾"//"之後的文字都會被javascript當做註解忽略掉的。
此外/*和*/之間的文字也會當做註解。這種註釋可以跨行書寫,但不能有巢狀註釋。
//單行註解
/*
*
*
*
*/
3.直接量
所謂直接量(literal),就是程式中直接使用的資料值,以下列出直接量
第3章會詳細講解數字和字串直接量。正規表示式直接量會在第10章講解。更多福祉的表達式,可以寫成陣列或物件直接量。
{x:1,y:2} //物件
[1,2,3,4,5] //陣列
4.識別字與保留字
標識符就是一個名字。在javascript中,標識符用來對變數和函數進行命名,或用做javascript程式碼中某些循環語句中的跳轉位置的標記。 javascript標識符必須以字母。底線、或美元符號開始。後續的字元可以是字母。數字。底線或美元符號(數字是不准作為首字母出現的,一遍javascript可以輕易區分開識別符和數字)、下面是合法的標識符
處於可移植性和易於書寫的考慮,通常我們只使用只使用ASCII字母和數字來書寫標識符。然後要注意的是,javascript允許標識符中出現Unicode字元全集中的字母和數字(從技術來將ECMAScript允許在標識符的首字符後面出現Unicode字符機制的Mn類,Mc類和P才類)、因此,程式設計師可以使用非英語的語言或數學符號來書寫識別符
javascript把一些識別符拿出來自己用做關鍵字,因此名就不能再在程式中把這些關鍵字用做標示符了。
javascript保留字
class const enum export
export extends import super
另外,這些關鍵字在普通的javascript中是合法的,但在嚴格模式下是保留字
implements let private public yield interface package
protected static
同樣嚴格模式下對下面的識別符做了嚴格的限制,但不能做變數名、參數名和函數名。
arguments eval
javascript的具體實作可能定義獨有的全域變數和函數,每一種特定的javascript運行環境(客戶端)伺服器等都有自己的一個全域屬性列表,這一點是需要牢記的。 (window物件來了解客戶端javascript定義全域變數和函數列表)
5.可選的分號
跟許多程式語言一樣,javascript使用分號(;)將語句分隔開。這對增強程式碼的可讀性和整潔性是非常重要的,缺少分隔符號一條語句結束就成了下一條語句的開始,反之亦然。
在javascript中,各自語句獨佔一行,通常可以省略語句之間的分號(程式結尾處使用「}」花括弧之前的分號也可以省略)。許多javascript程式設計師(包括本書的程式碼範例)都是使用分號來明確標記語句的結束,即使在並不完全需要分號的時候也是如此,另一種風格是在任何可以省略分號時都將其省略,只有在不得不使用的時候才使用分號,不管哪種程式設計風格,關於javascript有幾個細節需要注意。
如下碼,第一個分號是可以省略的
a=3;
b=4;
但如果依照以下格式書寫,第一個分號則不能省略。
a=3;b=4;
要注意的是,javascript並不是在所有的換行處都填補分號:只有在缺少了分號就無法正常解析程式碼的時候,javascript才會填補分號,換句話說(類似下面程式碼中的兩處異常),如果當前的語句和隨後的非空格字元不能當成一個整體解析的話,javascript就在當前語句的結束處來填補分號,看下如下程式碼
var a
a
=
3
console.log(a)
javascript將其解析為
var a;a=3;console.log(a);
javascript為第一行加了分號,如果沒有分號,javascript就無法解析程式碼中的var a a。第二個a可以單獨當做一條語句“a;”,但javascript沒有給第二行結尾處填補分號。因為它可以和第三行內容一起解析成"a=3;" .
有些語句的分隔規則會導致一些想不到的情形,這頓斷碼分成了兩行,看起來是兩條獨立的語句。
var y = x f
(a b).toString()
第二行的圓括號卻和第一行的f組成了一個函數調用,javascript會把這段程式碼看做
var y = x f(a b).toString();
顯然程式碼的本意不是這樣,為了能讓上述程式碼解析成兩個不同的語句,必須手動填入行為的顯示分號
通常來講,如果一條語句以( [ / -開始,那麼它極有可能和前條語句組合在一起解析,以/ -開始的語句不很常見,但以( [開始的語句則非常常見。會正確的解析;
如果目前語句和下一行語句無法合併解析。 javascript則在第一行後面填分號,這是通用規則,但有兩個欄位外。第一個例外是涉及returnm,birak,he continue語句,如果這三個關鍵字後面緊跟著換行。 javascript則會在換行處填補分號。例如
例如
return
true;
而 javascript解析成
return;ture;
而程式碼的本意是
return ture;
也就是說return,break,contuine好的隨後的表達式之間不能有換行,如果加入了換行,程式則在極有特殊情況才能報錯。而且程式的調試很不方便。
第二個例子是涉及到 --運算子時,這些表達式符號可以代表標識符表達式的前綴和後綴。如果將其又再後表達式,如果的將其用做後綴表達式。它和表達式應該要看做一行。否則行尾將填補分號。
以上程式碼解析為