編程語言的詞法結構是一套基礎性的規則,用來描述你如何編寫這門語言。作為語法的基礎,它規定了變量名是怎么樣的,如何寫注釋,以及語句之間是如何區分的。本節用很短的篇幅來介紹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)?;剀嚪訐Q行符在一起唄解析為一個單行的結束符。
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é" === "caf/u00e9" => true
Unicode轉義寫法可以出現在注釋中,但是由于javascript會將注釋忽略,他們只是被當成成上下文中的ascii字符處理,并不會接下到對于的Unicode字符
iiii標準化
Unicode允許使用多種方法對同一個字符進行編碼。比如字符é可以使用Unicode字符/u00E9,也可以使用普通的ascii字符e跟隨一個語調符號/u0301 ,在文本編輯器中,這兩個編碼顯示的結果是一摸一樣的,但是它們的二進制編碼表示是不一樣的,在計算機里也不相等。Unicode標準為索引字符定義了一個首選的代碼格式,并給出了一個標準化的處理方式將文本轉化為一種適合比較的標準格式,不會再對其它表示、字符串或者正則表達式做標準化處理。
2.注釋
javascript支持兩種注釋方式,在行尾"http://"之后的文本都會被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中,各自語句獨占一行,通??梢允÷哉Z句之間的分號(程序結尾處使用“}”花括弧之前的分號也可以省略)。很多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編碼符風格中是很常見的。有點程序員喜歡保守的在語句前邊加上一個分號,這樣,哪怕之前的語句被修稿了,分號被誤刪了,當前語句還是會正確的解析;
如果當前語句和下一行語句無法合并解析。javascript則在第一行后填補分號,這是通用規則,但有兩個列外。第一個例外是涉及到returnm,birak,he continue語句,如果這三個關鍵字后緊跟著換行。javascript則會在換行處填補分號。例如
例如
return
true;
而 javascript解析成
return;ture;
而代碼的本意是
return ture;
也就是說return,break,contuine好的隨后的表達式之間不能有換行,如果添加了換行,程序則在極有特殊情況才能報錯。而且程序的調試很不方便。
第二個例子是涉及到++ --運算符時,這些表達式符號可以代表標識符表達式的前綴和后綴。如果將其又再后表達式,如果的將其用做后綴表達式。它和表達式應該看做一行。否則行尾將填補分號。
以上代碼解析為
新聞熱點
疑難解答