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) 文字列である 1 つのパラメータを受け入れます。例:
このコード行は、次のコードと機能的に同等です:
インタプリタは eval() 呼び出しを見つけると、引数を実際の ECMAScript ステートメントとして解釈し、関数が存在する場所に挿入します。これは、 eval() 呼び出し内で参照される変数はパラメータの外で定義できることを意味します:
ここでは、変数 msg が eval() 呼び出しのコンテキストの外で定義されており、コードの 2 行目が実際のコード行に置き換えられるため、警告には依然として「hello world」というテキストが表示されます。同様に、関数または変数を eval() 呼び出し内で定義し、関数の外側のコードで参照することができます:
ここでは、関数 SayHi() が eval() 呼び出し内で定義されています。呼び出しは実際の関数に置き換えられるため、次の行でも SayHi() を呼び出すことができます。
この機能は非常に強力ですが、非常に危険でもあります。 eval() を使用するとき、特にユーザーが入力したデータを渡すときは、細心の注意を払ってください。悪意のあるユーザーは、サイトまたはアプリケーションのセキュリティを侵害する値を挿入する可能性があります (コード インジェクションと呼ばれます)。
グローバル オブジェクトにはメソッドだけでなくプロパティもあります。未定義、NaN、Infinity という特別な値を覚えていますか?これらはすべて Global オブジェクトのプロパティです。さらに、すべてのローカル オブジェクトのコンストラクターもグローバル オブジェクトのプロパティです。次の表では、Global オブジェクトのすべてのプロパティについて詳しく説明します:
属性
|
セイ・ミン |
||||||||||||||||||||||||||||||||||||||
未定義 | 未定義型のリテラル | ||||||||||||||||||||||||||||||||||||||
NaN | 数値ではない特殊な数値 | ||||||||||||||||||||||||||||||||||||||
無限 | 無限大の特別な数値 | ||||||||||||||||||||||||||||||||||||||
オブジェクト | オブジェクトのコンストラクター | ||||||||||||||||||||||||||||||||||||||
配列 | 配列のコンストラクター | ||||||||||||||||||||||||||||||||||||||
関数 | 関数のコンストラクター | ||||||||||||||||||||||||||||||||||||||
ブール値 | ブールコンストラクター | ||||||||||||||||||||||||||||||||||||||
文字列 | 文字列のコンストラクター | ||||||||||||||||||||||||||||||||||||||
番号 | 数値のコンストラクター | ||||||||||||||||||||||||||||||||||||||
日付 | 日付のコンストラクター | ||||||||||||||||||||||||||||||||||||||
RegExp | RegExp のコンストラクター | ||||||||||||||||||||||||||||||||||||||
エラー | エラーのコンストラクター | ||||||||||||||||||||||||||||||||||||||
EvalError | EvalError のコンストラクター | ||||||||||||||||||||||||||||||||||||||
範囲エラー | RangeError のコンストラクター | ||||||||||||||||||||||||||||||||||||||
参照エラー | ReferenceError のコンストラクター | ||||||||||||||||||||||||||||||||||||||
構文エラー | SyntaxError のコンストラクター | ||||||||||||||||||||||||||||||||||||||
タイプエラー | TypeError のコンストラクター | ||||||||||||||||||||||||||||||||||||||
URIエラー | URIError のコンストラクター |