Javascript Global對象
Global對象
Global對象是ECMAScript中最特別的對象,因?yàn)閷?shí)際上它根本不存在。如果嘗試編寫下面的代碼,將得到錯誤:
錯誤消息顯示Global不是對象,但剛才不是說Global是對象嗎?沒錯。這里需要理解的主要概念是,在ECMAScript中,不存在獨(dú)立的函數(shù),所有函數(shù)都必須是某個對象的方法。本書前面介紹的函數(shù),如isNaN()、isFinite()、parseInt()和parseFloat()等,看起來都像獨(dú)立的函數(shù)。實(shí)際上,它們都是Global對象的方法。而且Global對象的方法不止這些。
encodeURI()和encodeURIComponent()方法用于編碼傳遞給瀏覽器的URI(統(tǒng)一資源標(biāo)識符)。有效的URI不能包含某些字符,如空格。這兩個方法用于編碼URI,這樣用專門的UTF-8編碼替換所有的非有效字符,就可以使瀏覽器仍能夠接受并理解它們。
encodeURI()方法用于處理完整的URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()用于處理URI的一個片斷(如前面的URI中的illegal value.htm)。這兩個方法的主要區(qū)別是encodeURI()方法不對URI中的特殊字符進(jìn)行編碼,如冒號、前斜杠、問號和英鎊符號,而encodeURIComponent()則對它發(fā)現(xiàn)的所有非標(biāo)準(zhǔn)字符進(jìn)行編碼。例如:
這段代碼輸出兩個值:
可以看到,除空格外,第一個URI無任何改變,空格被替換為%20。第二個URI中的所有非字母數(shù)字字符都被替換成它們對應(yīng)的編碼,基本上使這個URI變得無用。這就是encodeURI()可以處理完整URI,而encodeURIComponent()只能處理附加在已有URI末尾的字符串的原因。
自然,還有兩個方法用于解碼編碼過的URI,即decodeURI()和decodeURIComponent()。如你所料,這兩個方法所做的恰與其對應(yīng)的方法相反。decodeURI()方法只對用encodeURI()方法替換的字符解碼。例如,%20將被替換為空格,而%23不會被替換,因?yàn)樗硎镜氖怯㈡^符號(#),encodeURI()并不替換這個符號。同樣的,decodeURIComponent()會解碼所有encodeURIComponent()編碼過的字符,意味著它將對所有的特殊值解碼。例如:
這段代碼輸出兩個值:
在這個例子中,變量uri存放的是用encodeURIComponent()編碼的字符串。生成的值說明了應(yīng)用兩個解碼方法時會發(fā)生的事情。第一個值由decodeURI()輸出,把%20替換成空格。第二個值由decodeURIComponent()輸出,替換所有的特殊。
這些URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURICom- ponent()代替了BOM的escape()和unescape()方法。URI方法更可取,因?yàn)樗鼈儠λ蠻nicode符號編碼,而BOM方法只能對ASCII符號正確編碼。盡量避免使用escape()和unescape()方法。
最后一個方法可能是整個ECMAScript語言中最強(qiáng)大的方法,即eval()方法。該方法就像整個ECMAScript的解釋程序,接受一個參數(shù),即要執(zhí)行的ECMAScript(或JavaScript)字符串。例如:
這行代碼的功能等價于下面的代碼:
當(dāng)解釋程序發(fā)現(xiàn)eval()調(diào)用時,它將把參數(shù)解釋為真正的ECMAScript語句,然后把它插入該函數(shù)所在的位置。這意味著eval()調(diào)用內(nèi)部引用的變量可在參數(shù)以外定義:
這里,變量msg是在eval()調(diào)用的環(huán)境外定義的,而警告仍然顯示的是文本"hello world",因?yàn)榈诙写a將被替換為一行真正的代碼。同樣,可以在eval()調(diào)用內(nèi)部定義函數(shù)或變量,然后在函數(shù)外的代碼中引用:
這里,函數(shù)sayHi()是在eval()調(diào)用內(nèi)部定義的。因?yàn)樵撜{(diào)用將被替換為真正的函數(shù),所以仍可在接下來的一行中調(diào)用sayHi()。
這種功能非常強(qiáng)大,不過也非常危險。使用eval()時要極度小心,尤其在給它傳遞用戶輸入的數(shù)據(jù)時。惡意的用戶可能會插入對站點(diǎn)或應(yīng)用程序的安全性有危害的值(叫做代碼注入)。
Global對象不只有方法,它還有屬性。還記得那些特殊值undefined、NaN和Infinity嗎?它們都是Global對象的屬性。此外,所有本地對象的構(gòu)造函數(shù)也都是Global對象的屬性。下表較詳細(xì)地說明了Global對象的所有屬性:
屬 性 |
說 明 |
undefined |
Undefined類型的字面量 |
NaN |
非數(shù)的專用數(shù)值 |
Infinity |
無窮大值的專用數(shù)值 |
Object |
Object的構(gòu)造函數(shù) |
Array |
Array的構(gòu)造函數(shù) |
Function |
Function的構(gòu)造函數(shù) |
Boolean |
Boolean的構(gòu)造函數(shù) |
String |
String的構(gòu)造函數(shù) |
Number |
Number的構(gòu)造函數(shù) |
Date |
Date的構(gòu)造函數(shù) |
|
RegExp的構(gòu)造函數(shù) |
Error |
Error的構(gòu)造函數(shù) |
EvalError |
EvalError的構(gòu)造函數(shù) |
RangeError |
RangeError的構(gòu)造函數(shù) |
ReferenceError |
ReferenceError的構(gòu)造函數(shù) |
SyntaxError |
SyntaxError的構(gòu)造函數(shù) |
TypeError |
TypeError的構(gòu)造函數(shù) |
URIError |
URIError的構(gòu)造函 |
- Javascript類庫的頂層對象名用戶體驗(yàn)分析
- JS window對象的top、parent、opener含義介紹
- js window對象屬性和方法相關(guān)資料整理
- javascript window對象屬性整理
- JavaScript中Window對象的屬性及事件
- JavaScript的document對象和window對象詳解
- Nodejs學(xué)習(xí)筆記之Global Objects全局對象
- JavaScript高級程序設(shè)計(jì) 讀書筆記之十一 內(nèi)置對象Global
- JavaScript內(nèi)置對象math,global功能與用法實(shí)例分析
- ES6頂層對象、global對象實(shí)例分析
相關(guān)文章
JavaScript高級程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記5 js語句
下面采用類似的形式整理一下語句的相關(guān)知識,重點(diǎn)突出一些ECMAScript中比較特別和個人認(rèn)為比較有意思的地方,同樣,沒有強(qiáng)調(diào)的但比較基礎(chǔ)的語句并非不重要,而是我認(rèn)為你已經(jīng)熟悉2012-10-10JavaScript CSS修改學(xué)習(xí)第三章 修改樣式表
在這一章我打算通過直接修改頁面的樣式表而不是通過訪問元素的辦法來修改PRE的背景顏色。不幸的是,瀏覽器嚴(yán)重的不兼容性讓這個代碼基本上不能使用。2010-02-02js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差別介紹
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差別介紹,需要的朋友可以看看2012-05-05詳解js運(yùn)算符單豎杠“|”與“||”的用法和作用介紹
在js開發(fā)應(yīng)用中我們通常會碰到“|”與“||”了,那么在運(yùn)算中“|”與“||”是什么意思呢?本篇文章主要介紹了詳解js運(yùn)算符單豎杠“|”與“||”的用法,有需要的可以了解一下。2016-11-11