一、語法結構 編程語言的語法結構是一套基礎性規則,用來描述如何使用這門語言來編寫程式。作為語法的基礎,它規定了諸如變數名的命名規範,註釋的規範,以及程式語句之間如何分隔等規則。下麵是介紹JavaScript的基本語法結構。 1、字元集JavaScript程式是用Unicode字元集編寫的,所以它幾乎 ...
一、語法結構
編程語言的語法結構是一套基礎性規則,用來描述如何使用這門語言來編寫程式。作為語法的基礎,它規定了諸如變數名的命名規範,註釋的規範,以及程式語句之間如何分隔等規則。下麵是介紹JavaScript的基本語法結構。
1、字元集
JavaScript程式是用Unicode字元集編寫的,所以它幾乎支持世界上的所有語言。
2.1.1區分大小寫
JavaScript是區分大小寫的,關鍵字,變數名,函數名和所有標識符都必須採用一致的大小寫形式,如關鍵字while和While、WHILE分別代表不同的意義。
但需要註意的是,HTML並不區分大小寫(儘管XHTML區分大小寫,但由於瀏覽器的容錯能力還是會正確解析渲染的)。由於他和客戶端JavaScript聯繫緊密,因此這裡很容易混淆。許多客戶端JavaScript對象和屬性與他們所表示的HTML標簽和屬性同名,在HTML中這些標簽和屬性名可以使用大寫也可以是小寫,而在JavaScript中必須是小寫。例如在HTML中設置事件處理程式時,onclick屬性可以寫成onClick,但在JavaScript代碼(或者XHTML文檔)中,必須使用小寫的onclick。
2.1.2 空格、換行符和格式控制符
JavaScript會忽略程式中標識(token)之間的空格,換行符。由於可以在代碼中隨意使用空格和換行,因此可以採用整齊,一致的縮進來形成統一的編碼風格,從而提高代碼的可讀性。
除了可以識別普通的空格符(\u0020),JavaScript還可以識別如下這些表示空格的字元:
水平製表符(\u0009)
垂直製表符(\u000B)
換頁符(\u000C)
不中斷空白(\u00A0)
位元組序標記(\ufeff)
JavaScript將如下字元識別為行結束符:
換行符(\u000A)
回車符(\u000D)
行分隔符(\u2028)
段分隔符(\u2029)
回車符加換行符在一起被解析為一個單行結束符。
2.2註釋
JavaScript支持兩種格式的註釋。
行註釋:在“//”之後的文本都會被JavaScript當做註釋忽略,
多行註釋:“/*”多行註釋“*/,註意多行註釋是不能嵌套的。
2.3直接量
所謂直接量就是程式中可以直接使用的數值,如下類型:
整數:1,2,3...
小數:1.2,2.34,...
字元串:“Hello World”
bool:true,false。
正則表達式:/正則表達式規則/
null:空
2.4標識符的命名規則
JavaScript中標識符必須以字母、下劃線或$開始,後續的字元可以是字母,數字,下劃線或美元符($)。需要註意的是和其它語言一樣,標識符名是不能以數字開頭的。
2.5保留字
我 們在命名變數名時不能與JavaScript的保留字重名。下麵是一些常見關鍵字:
abstract | arguments | boolean | break | byte |
case | catch | char | class* | const |
continue | debugger | default | delete | do |
double | else | enum* | eval | export* |
extends* | false | final | finally | float |
for | function | goto | if | implements |
import* | in | instanceof | int | interface |
let | long | native | new | null |
package | private | protected | public | return |
short | static | super* | switch | synchronized |
this | throw | throws | transient | true |
try | typeof | var | void | volatile |
while | with | yield |
2.6可選的分號
和其它許多編程語言一樣,JavaScript使用分號(;)將語句分隔開,這對增強代碼的可讀性和整潔性是非常重要的,缺少分隔符,一條語句的結束就變成了下一條語句的開始。在JavaScript中如果語句獨占一行,通常可以省略分號,但還是建議使用分號來明確標記語句的結束,這是一種編程風格,還有一種就是在任何可以省略分號的地方都將其省略,只有在不得不用的時候才使用分號,介於這種風格需要註意以下問題:
// 1、兩條語句獨占一行,並且能被正確解析。所以可以省略分號 a = 3 b = 4 // 2、兩條語句在一行,必須用分號標明語句的結束位置 a = 3; b = 4; // b的分號可以省略 // 3、下麵要註意的就是JavaScript並不是將所有獨占一行的語句都自動填補分號 // 前提是獨占一行的語句能夠得到正確的解析,如下代碼: var a a = 3 console.log(a) // 會被解析成如下代碼 var a; a = 3; console.log(a); // 4、下麵是很容易造成混淆和難以理解的地方 var y = x + f (a+b).toString() // 也許我們會認為JavaScript會解析成這樣var y = x + f;(a+b).toString() /* 實際JavaScript會解析成var y = x + f(a+b).toString() 而上述代碼的本意並不是這樣,所以為了正確解析,需要寫分號來明確語句的結束。 通常來講,如果一條語句以(、[、/、+、-開始,name它既有可能和前一條 語句何在一起解析。以/、+、-開始的語句並不常見,而已(和[開始的語句 則非常常見,有些程式員喜歡保守的在語句前加一個分號,這樣哪怕之前的 語句被修改了,分號被誤刪除了,當前語句還是會正確解析: */ var y = x + f; ;(a+b).toString(); // 5、return和continue需要註意的地方 return true; /* 本意是 return true; 實際是return;true; 在return和continue後面的表達式不能有換行。如果添加了換行,程式則只有在極特殊的情況才會報錯,而且程式的調試非常不方便。 */ // 關於++和--需要註意的地方 x ++ y // 會被解析成x;++y;
所以為了避免上述情況的發生,和代碼的可讀性最好還是在語句的結束位置添加分號。
二 數據類型、值和變數
JavaScript的數據類型分為兩類
原始類型(primitive type):數字、字元串、布爾值。
對象類型(object type):object。
JavaScript有兩個特殊的原始值:null和undefined(未定義),它們不是數字,字元串和布爾值,它們通常分別代表了各自特屬於類型的唯一成員。
關於對象object是屬性(property)的集合,每個屬性都由“鍵:值”構成。
普通的JavaScript對象是“鍵:值”的無序集合,JavaScript同樣定義了一種特殊對象數組(array),表示帶編號的值的有序集合。JavaScript為數組定義了專用的語法,使數組擁有一些和普通對象不同的特性。
JavaScript還定義了另一種特殊對象函數,函數是具有與它向關聯的可執行代碼的對象,通過調用函數來運行可執行代碼,並返回運算結果。
如果函數用來初始化(使用new運算符)一個新建的對象,我們稱之為構造函數(constructor)。除了數組array類和函數之外,JavaScript定義了三種有用的類,日期(data)定義了日期對象,正則(RegExp)類定義了正則表達式對象。錯誤(error)定義了JavaScript程式運行時錯誤和語法錯誤的對象。
JavaScript解釋器有自己的記憶體管理機制,可以自動對記憶體進行垃圾回收。這意味著程式員可以按需創建對象,不必擔心這些對象的銷毀和記憶體回收。當不再有任何引用指向一個對象,解釋器就會知道這個對象沒用了,然後自動回收它所占用的記憶體資源。
JavaScript程式可以更改對象屬性值和元組元素的值,數字、布爾值、null和undefined屬於不可變類型。JavaScript可以自由的進行數據類型轉換,如果在程式期望使用字元串的地方使用了數字,JavaScript會自動將數字轉換成字元串,如果在期望使用布爾值的地方使用了非布爾值,JavaScript會進行相應的轉換。
JavaScript變數是無類型的,變數可以被賦予任何類型的值,同樣一個變數可以重新賦予不同類型的值。使用var關鍵字來聲明變數。JavaScript採用詞法作用域(lexical scoping)。不在函數內聲明聲明的變數稱為全局變數,它在JavaScript程式中的任何地方都是可見的,在函數內部聲明的變數被稱為局部變數,局部變數會隨著函數的結束而銷毀。