Global對象
Global對象是ECMAScript中最特別的對象,因為實際上它根本不存在。如果嘗試編寫下面的代碼,將得到錯誤:
錯誤訊息顯示Global不是對象,但剛才不是說Global是對象嗎?沒錯。這裡需要理解的主要概念是,在ECMAScript中,不存在獨立的函數,所有函數都必須是某個對象的方法。本書前面介紹的函數,如isNaN()、isFinite()、parseInt()和parseFloat()等,看起來都像獨立的函數。實際上,它們都是Global對象的方法。而且Global對象的方法不止這些。
encodeURI()和encodeURIComponent()方法用於編碼傳遞給瀏覽器的URI(統一資源識別項)。有效URI不能包含某些字元,如空格。這兩個方法用於編碼URI,這樣用專門的UTF-8編碼替換所有的非有效字元,就可以使瀏覽器仍能夠接受並理解它們。
encodeURI()方法用於處理完整的URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()用於處理URI的一個片斷(如前面的URI中的illegal value.htm)。這兩個方法的主要區別是encodeURI()方法不對URI中的特殊字元進行編碼,如冒號、前斜杠、問號和英鎊符號,而encodeURIComponent()則對它發現的所有非標準字元進行編碼。例如:
這段代碼輸出兩個值:
可以看到,除空格外,第一個URI無任何改變,空格被替換為%20。第二個URI中的所有非字母數字字元都被替換成它們對應的編碼,基本上使這個URI變得無用。這就是encodeURI()可以處理完整URI,而encodeURIComponent()只能處理附加在已有URI末尾的字串的原因。
自然,還有兩個方法用於解碼編碼過的URI,即decodeURI()和decodeURIComponent()。如你所料,這兩個方法所做的恰與其對應的方法相反。decodeURI()方法只對用encodeURI()方法替換的字元解碼。例如,%20將被替換為空白格,而%23不會被替換,因為它表示的是英鎊符號(#),encodeURI()並不替換這個符號。同樣的,decodeURIComponent()會解碼所有encodeURIComponent()編碼過的字元,意味著它將對所有的特殊值解碼。例如:
這段代碼輸出兩個值:
在這個例子中,變數uri存放的是用encodeURIComponent()編碼的字串。產生的值說明了應用兩個解碼方法時會發生的事情。第一個值由decodeURI()輸出,把%20替換成空格。第二個值由decodeURIComponent()輸出,替換所有的特殊。
這些URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURICom- ponent()代替了BOM的escape()和unescape()方法。URI方法更可取,因為它們會對所有Unicode符號編碼,而BOM方法只能對ASCII符號正確編碼。盡量避免使用escape()和unescape()方法。
最後一個方法可能是整個ECMAScript語言中最強大的方法,即eval()方法。該方法就像整個ECMAScript的解釋程式,接受一個參數,即要執行的ECMAScript(或JavaScript)字串。例如:
這行代碼的功能等價於下面的代碼:
當解釋程式發現eval()調用時,它將把參數解釋為真正的ECMAScript語句,然後把它插入該函數所在的位置。這意味著eval()調用內部引用的變數可在參數以外定義:
這裡,變數msg是在eval()調用的環境外定義的,而警告仍然顯示的是文本"hello world",因為第二行代碼將被替換為一行真正的代碼。同樣,可以在eval()調用內部定義函數或變數,然後在函數外的代碼中引用:
這裡,函數sayHi()是在eval()調用內部定義的。因為該調用將被替換為真正的函數,所以仍可在接下來的一行中調用sayHi()。
這種功能非常強大,不過也非常危險。使用eval()時要極度小心,尤其在給它傳遞使用者輸入的資料時。惡意的使用者可能會插入對網站或應用程式的安全性有危害的值(叫做代碼注入)。
Global對象不只有方法,它還有屬性。還記得那些特殊值undefined、NaN和Infinity嗎?它們都是Global對象的屬性。此外,所有本機物件的建構函式也都是Global對象的屬性。下表較詳細地說明了Global對象的所有屬性:
屬 性 |
說 明 |
undefined |
Undefined類型的字面量 |
NaN |
非數的專用數值 |
Infinity |
無窮大值的專用數值 |
Object |
Object的建構函式 |
Array |
Array的建構函式 |
Function |
Function的建構函式 |
Boolean |
Boolean的建構函式 |
String |
String的建構函式 |
Number |
Number的建構函式 |
Date |
Date的建構函式 |
RegExp |
RegExp的建構函式 |
Error |
Error的建構函式 |
EvalError |
EvalError的建構函式 |
RangeError |
RangeError的建構函式 |
ReferenceError |
ReferenceError的建構函式 |
SyntaxError |
SyntaxError的建構函式 |
TypeError |
TypeError的建構函式 |
URIError |
URIError的構造函 |