ECMAScript的基礎概念
熟悉Java、C和Perl這些語言的開發者會發現ECMAScript的語法很容易掌握,因為它借用了這些語言的語法。Java和ECMAScript有一些關鍵語法特性相同,也有一些完全不同。ECMAScript的基礎概念如下:
- 區分大小寫。與Java一樣,變數、函式名、運算子以及其他一切東西都是區分大小寫的,也就是說,變數test不同於變數Test。
- 變數是弱型別的。與Java和C不同,ECMAScript中的變數無特定的型別,定義變數時只用var運算子,可以將它初始化為任意的值。這樣可以隨時改變變數所存資料的型別(儘管應該避免這樣做,但作為Web開發,這確實可以提高效率)。
- 每行結尾的分號可有可無。Java、C和Perl都要求每行程式碼以分號(;)結束才符合語法。ECMAScript則允許開發者自行決定是否以分號結束一行程式碼。如果沒有分號,ECMAScript就把這行程式碼的結尾看作該語句的結尾(與Visual Basic和VBScript相似),前提是這樣沒有破壞程式碼的語義。最好的程式碼編寫習慣是總加入分號,因為沒有分號,有些瀏覽器就不能正確執行!
- 註釋與Java、C和PHP語言的註釋相同。ECMAScript借用了這些語言的註釋語法。有兩種型別的註釋——單行註釋和多行註釋。單行註釋以雙斜線(//)開頭。多行註釋以單斜線和星號(/*)開頭,以星號加單斜線結尾(*/)。
- 括號表明程式碼塊。從Java中借鑑的另一個概念是程式碼塊。程式碼塊表示一系列應該按順序執行的語句,這些語句被封裝在左括號({)和右括號(})之間。
一些示例如下:
var txt = "some string"; TXT = "other string";//TXT無須宣告,可以直接賦值 alert(txt==TXT);//false var str = "string" //分號可有可無 var hob = "No";var bob = "Yes";//使用分號,可以在一行上寫多行語句 /* 多行註釋 alert("註釋中的程式碼不會被執行") */ if (txt=="some string") {//程式碼塊 alert(true); }
變數
如前所述,ECMAScript中的變數是用var運算子(variable的縮寫)加變數名定義的,例如:
var test = "Hello!World!";
在這個例子中,宣告瞭變數test,並把它的值初始化為"Hello!World!"(字串)。由於ECMAScript是弱型別的,所以解釋程式會為test自動建立一個字串值,無需明確的型別宣告。還可以用一個var語句定義兩個或多個變數:
var a = "some",b="string"
前面的程式碼定義了變數test,初始值為"some",還定義了變數test2,初始值為"string"。不過用同一個var語句定義的變數不必具有相同的型別,如下所示:
var a=12,b="string";
即使a和b屬於兩種不同的資料型別,在ECMAScript中這樣定義也是完全合法的。與Java不同,ECMAScript中的變數並不一定要初始化(它們是在幕後初始化的,將在後面討論這一點)。因此,下面一行程式碼也是有效的:
var a; //只宣告
此外,與Java不同的還有變數可以存放不同型別的值。這是弱型別變數的優勢。例如,可以把變數初始化為字串型別的值,之後把它設定為數字值,如下所示:
var test = "string"; alert(test); //.....若干程式碼後 test=123;//更改了型別 alert(test);
這段程式碼將毫無問題地輸出字串值和數字值。但是,如前所述,使用變數時,好的編碼習慣是始終存放相同型別的值。變數名需要遵守兩條簡單的規則:
- 第一個字元必須是字母、下劃線(_)或美圓符號($)
- 餘下的字元可以是下劃線、美圓符號或任何字母或數字字元。
下面的變數名都是合法的:
var a; var $a; var $; var _a; var _; var a23;
當然,只是因為變數名的語法正確並不意味著就該使用它們。變數還應遵守一條著名的命名規則:
- Camel標記法——首字母是小寫的,接下來的單詞都以大寫字母開頭
- Pascal標記法——首字母是大寫的,接下來的單詞都以大寫字母開頭
- 匈牙利型別標記法——在以Pascal標記法命名的變數前附加一個小寫字母(或小寫字母序列),說明該變數的型別。例如,i表示整數,s表示字串
下面的表列出了用匈牙利型別標記法定義ECMAScript變數使用的字首:
型別 | 字首 | 示例 |
---|---|---|
陣列 | a | aValues |
布林型 | b | bFound |
浮點型(數字) | f | fValue |
函式 | fn | fnMethod |
整型(數字) | i | iValue |
物件 | o | oType |
正規表示式 | re | rePattern |
字串 | s | sValue |
變型(可以是任何型別) | v | vValue |
下面是一些命名示例
var userName="CJ";//駝峰命名方式 var UserName="CJ";//Pascal命名方式 var sUserName="CJ";//匈牙利命名方式
ECMAScript另一個有趣的方面(也是與大多數程式設計語言的主要區別)是在使用變數之前不必宣告。例如:
var str ="some"; otherStr += str+" "+"string"; alert(otherStr);
在上面的程式碼中,變數otherStr並沒有用var運算子定義,這裡只是插入了它,就像已經宣告過它。ECMAScript的解釋程式遇到未宣告過的識別符號時,用該變數名建立一個全域性變數,並將其初始化為指定的值。這是該語言的便利之處,不過如果不能緊密跟蹤變數,這樣做也很危險。最好的習慣是像使用其他程式設計語言一樣,總是宣告所有變數。
關鍵字
ECMA-262定義了ECMAScript支援的一套關鍵字(keyword)。這些關鍵字標識了ECMAScript語句的開頭和/或結尾。根據規定,關鍵字是保留的,不能用作變數名或函式名。下面是ECMAScript關鍵字的完整列表:
break | else | new | var |
case | finally | return | void |
catch | for | switch | while |
continue | function | this | with |
default | if | throw | |
delete | in | try | |
do | instanceof | typeof |
如果把關鍵字用作變數名或函式名,可能得到諸如“Identifier expected”(應該有識別符號,缺少識別符號)這樣的錯誤訊息。
保留字
保留字是對於JavaScript有特殊含義的單詞。因此,不能將它們用作變數名或函式名。也就是說,它們可能是JavaScript未來版本中的命令。現在就應該避免使用它們,以免在新版本釋出時不得不修改程式碼。如果將保留字用作變數名或函式名,那麼除非將來的瀏覽器實現了該保留字,否則很可能收不到任何錯誤訊息。當瀏覽器將其實現後,該單詞將被看作關鍵字,如此將出現關鍵字錯誤。
ECMAScript 3為以後保留的單詞:
abstract | final | protected |
boolean | float | public |
byte | goto | short |
char | implements | static |
class | import | super |
const | int | synchronized |
debugger | interface | throws |
double | long | transient |
enum | native | volatile |
export | package | extends |
private |
ECMAScript 4:ECMAScript4現在還沒有什麼實現.ECMAScript4中,下面的不再是保留字了,但也應該儘量不要使用它們
boolean final short byte float static char int double long
下面的被加入了保留字
as namespace use false true null is