全局對象

2018-06-16 15:26 更新

 唯一的全局對象建立在控制進入任何執(zhí)行環(huán)境之前。

 除非另外指明,全局對象的標準內(nèi)置屬性擁有特性 {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}。

 全局對象沒有 [[Construct]] 內(nèi)部屬性 ; 全局對象不可能當做構(gòu)造器用 new 運算符調(diào)用。

 全局對象沒有 [[Call]] 內(nèi)部屬性,全局對象不可能當做函數(shù)來調(diào)用。

 全局對象的 [[Prototype]] 和 [[Class]] 內(nèi)部屬性值是依賴于實現(xiàn)的。

 除了本規(guī)范定義的屬性之外,全局對象還可以擁有額外的宿主定義的屬性。全局對象可包含一個值是全局對象自身的屬性;例如,在 HTML 文檔對象模型中全局對象的 window 屬性是全局對象自身。

全局對象的值屬性

NaN

 NaN 的值是 NaN(見 8.5)。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Infinity

 Infinity 的值是 +∞(見 8.5)。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

undefined

 undefined 的值是 undefined(見 8.1)。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

全局對象的函數(shù)屬性

eval (x)

 當用一個參數(shù) x 調(diào)用 eval 函數(shù),采用如下步驟:

  1. 如果 Type(x) 不是 String, 返回 x.
  2. 令 prog 為 ECMAScript 代碼,它是將 x 作為一個程序解析的結(jié)果。如果解析失敗,拋出一個 SyntaxError 異常 ( 見 16 章 )。
  3. 令 evalCtx 為給 eval 代碼 prog 建立的新執(zhí)行環(huán)境 (10.4.2)。
  4. 令 result 為解釋執(zhí)行程序 prog 的結(jié)果。
  5. 退出執(zhí)行環(huán)境 evalCtx, 恢復(fù)到之前的執(zhí)行環(huán)境。
  6. 如果 result.type 是 normal 并且其完結(jié)類型值是 V, 則返回 V 值 .
  7. 如果 result.type 是 normal 并且其完結(jié)類型值是 empty, 則返回 undefined 值 .
  8. 否則,result.type 必定是 throw。將 result.value 作為異常拋出 .
直接調(diào)用 Eval

 一個 eval 函數(shù)的直接調(diào)用是表示為符合以下兩個條件的 CallExpression:

 解釋執(zhí)行 CallExpression 中的 MemberExpression 的結(jié)果是個 引用 ,這個引用擁有一個 環(huán)境記錄項 作為其基值,并且這個引用的名稱是 "eval"。

 以這個 引用 作為參數(shù)調(diào)用 GetValue 抽象操作的結(jié)果是 15.1.2.1 定義的標準內(nèi)置函數(shù)。

parseInt (string , radix)

 parseInt 函數(shù)根據(jù)指定的參數(shù) radix,和 string 參數(shù)的內(nèi)容解釋結(jié)果來決定,產(chǎn)生一個整數(shù)值。string 開頭的空白會被忽略。如果 radis 是 undefined 或 0,假定它是 10,除非數(shù)字是以字符對 0x 或 0X 開頭的,這時假定 radix 是 16。如果 radix 是 16,數(shù)字開頭的字符對 0x 或 0X 是可選的。

 當調(diào)用 parseInt 函數(shù)時,采用以下步驟:

  1. 令 inputString 為 ToString(string)。
  2. 令 S 為一個新創(chuàng)建的子字符串,它由 inputString 的第一個非 StrWhiteSpaceChar 字符和它后面跟著的所有字符組成。( 換句話說 , 刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符 , 則令 S 為空字符串。
  3. 令 sign 為 1。
  4. 如果 S 不是空并且 S 的第一個字符是減號 -, 則令 sign 為?1。
  5. 如果 S 不是空并且 S 的第一個字符加號 + 或減號 -, 則刪除 S 的第一個字符。
  6. 令 R = ToInt32(radix).
  7. 令 stripPrefix 為 true.
  8. 如果 R ≠ 0, 則如果 R < 2 或 R > 36, 則返回 NaN。如果 R ≠ 16, 令 stripPrefix 為 false.
  9. 否則 , R = 0令 R = 10.
  10. 如果 stripPrefix 是 true, 則如果 S 長度大于 2 并且 S 的頭兩個字符是“0x”或“0X”, 則刪除 S 的頭兩個字符并且令 R = 16.
  11. 如果 S 包含任何不是 radix-R 進制的字符,則令 Z 為 S 的這樣的字符之前的所有字符組成的子字符串;否則令 Z 為 S。.
  12. 如果 Z 是空 , 返回 NaN.
  13. 令 mathInt 為 Z 的 radix-R 進制表示的數(shù)學值,用字母 A-Z 和 a-z 來表示 10 到 35 之間的值。( 但是 , 如果 R 是 10 并且 Z 包含多余 20 位的值 , 可以替換 20 位后的每個數(shù)字為 0, 這是實現(xiàn)可選的功能 ; 如果 R 不是 2, 4, 8, 10, 16, 32, 則 mathInt 可以是 Z 的 radix-R 進制表示的依賴于實現(xiàn)的近似值。)
  14. 令 number 為 mathInt 的數(shù)值 .
  15. 返回 sign × number.

 parseInt 可以只把 string 的開頭部分解釋為整數(shù)值;它會忽略所有不能解釋為整數(shù)記法的一部分的字符,并且沒有指示會給出任何這些忽略的字符。

parseFloat (string)

 parseFloat 函數(shù)根據(jù) string 參數(shù)的內(nèi)容解釋為十進制字面量的結(jié)果來決定,產(chǎn)生一個數(shù)值。

 當調(diào)用 parseFloat 函數(shù),采用以下步驟:

  1. 令 inputString 為 ToString(string).
  2. 令 trimmedString 為一個新創(chuàng)建的子字符串,它由 inputString 的非 StrWhiteSpaceChar 字符的最左邊字符和它右邊跟著的所有字符組成。( 換句話說 , 刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符 , 則令 trimmedString 為空字符串。
  3. 如果 trimmedString 或 trimmedString 的任何前綴都不滿足 StrDecimalLiteral ( 見 9.3.1) 的語法 , 返回 NaN。
  4. 令 numberString 為滿足 StrDecimalLiteral 語法的 trimmedString 的最長前綴,可能是 numberString 自身。
  5. 返回 numberString 的 MV 的數(shù)值。

 parseFloat 可以只把 string 的開頭部分解釋為數(shù)值;它會忽略所有不能解釋為數(shù)值字面量記法的一部分的字符,并且沒有指示會給出任何這些忽略的字符。

isNaN (number)

 如果指定參數(shù)為 NaN,則返回 true,否則返回 false。

  1. 如果 ToNumber(number) 是 NaN, 返回 true.
  2. 否則 , 返回 false.

 一個用 ECMAScript 代碼來測試值 X 是否是 NaN 的方式是用 X !== X 表達式。當且僅當 X 是 NaN 時結(jié)果才是 true。

isFinite (number)

 如果指定參數(shù)為 NaN 或 +∞或?∞,則返回 false,否則返回 true。

  1. 如果 ToNumber(number) 是 NaN 或 +∞或?∞, 返回 false.
  2. 否則 , 返回 true.

處理 URI 的函數(shù)屬性

 統(tǒng)一資源標識符,或叫做 URI,是用來標識互聯(lián)網(wǎng)上的資源(例如,網(wǎng)頁或文件)和怎樣訪問這些資源的傳輸協(xié)議(例如,HTTP 或 FTP)的字符串。除了 15.1.3.1, 15.1.3.2, 15.1.3.3,15.1.3.4 說明的用來編碼和解碼 URI 的函數(shù)之外 ECMAScript 語言自身不提供任何使用 URL 的支持。

 許多 ECMAScript 實現(xiàn)提供額外的函數(shù),方法來操作網(wǎng)頁;這些函數(shù)超出了本標準的范圍。

 一個 URI 是由組件分隔符分割的組件序列組成。其一般形式是:

 Scheme : First / Second ; Third ? Fourth

 其中斜體的名字代表組件;“:”, “/”, “;”,“?”是當作分隔符的保留字符。encodeURI 和 decodeURI 函數(shù)操作的是完整的 URI;這倆函數(shù)假定 URI 中的任何保留字符都有特殊意義,所有不會編碼它們。encodeURIComponent 和 decodeURIComponent 函數(shù)操作的是組成 URI 的個別組件;這倆函數(shù)假定任何保留字符都代表普通文本,所以必須編碼它們,所以它們出現(xiàn)在組成一個完整 URI 的組件里面時不會解釋成保留字符了。

 以下詞法文法指定了編碼后 URI 的形式。

 語法

uri ::: uriCharactersopt uriCharacters ::: uriCharacter uriCharactersopt uriCharacter ::: uriReserved uriUnescaped uriEscaped uriReserved ::: one of ; / ? : @ & = + $ , uriUnescaped ::: uriAlpha DecimalDigit uriMark uriEscaped ::: % HexDigit HexDigit uriAlpha ::: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z uriMark ::: one of - _ . ! ~ * ' ( )

 以上語法是基于 RFC 2396 的,并且較新的 RFC 3986 引入的更改沒有反應(yīng)在這里。

 當 URI 里包含一個沒在上面列出的字符或有時不想讓給定的保留字符有特殊意義,那么必須編碼這個字符。字符被轉(zhuǎn)換成 UTF-8 編碼,首先從 UT F-16 轉(zhuǎn)換成相應(yīng)的代碼點值的替代對。(注:在 [0,127] 范圍的代碼單元在單字節(jié)中具有相同返回值。)然后返回的字節(jié)序列轉(zhuǎn)換為一個字符串,每個字節(jié)用一個“%xx”形式的轉(zhuǎn)移序列表示。

 描述編碼和轉(zhuǎn)義過程的抽象操作 Encode 需要兩個字符串參數(shù) string 和 unescapedSet。

  1. 令 strLen 為 string 的字符個數(shù) .
  2. 令 R 為空字符串 .
  3. 令 k 為 0.
  4. 重復(fù)如果 k 等于 strLen, 返回 R.令 C 為 string 中位置為 k 的字符 .如果 C 在 unescapedSet 里 , 則令 S 為一個只包含字符 C 的字符串 .令 R 為之前 R 的值和 S 連接得到的一個新字符串值 .否則 , C 不在 unescapedSet 里如果 C 的代碼單元值不小于 0xDC00 并且不大于 0xDFFF, 則拋出一個 URIError 異常 .如果 C 的代碼單元值小于 0xD800 或大于 0xDBFF, 則令 V 為 C 的代碼單元值 .否則 ,k 遞增 1.如果 k 等于 strLen, 拋出一個 URIError 異常 .令 kChar 為 string 的 k 位置的字符的代碼單元值 .如果 kChar 小于 0xDC00 或大于 0xDFFF, 則拋出一個 URIError 異常 .令 V 為 (((C 的代碼單元值 ) – 0xD800) * 0x400 + (kChar – 0xDC00) + 0x10000).令 Octets 為 V 執(zhí)行 UTF-8 轉(zhuǎn)換的結(jié)果字節(jié)排列 , 令 L 為這個字節(jié)排列的長度 .令 j 為 0.只要 j < L,就重復(fù)令 jOctet 為 Octets 的 j 位置的值 .令 S 為一個包含三個字符“%XY”的字符串,這里 XY 是編碼 jOctet 值的兩個大寫 16 進制數(shù)字 .令 R 為之前 R 的值和 S 連接得到的一個新字符串值 .j 遞增 1.k 遞增 1.

 描述反轉(zhuǎn)義和解碼過程的抽象操作 Decode 需要兩個字符串參數(shù) string 和 reservedSet。

  1. 令 strLen 為 string 的字符個數(shù) .
  2. 令 R 為空字符串 .
  3. 令 k 為 0.
  4. 重復(fù)如果 k 等于 strLen, 返回 R.令 C 為 string 的 k 位置的字符 .如果 C 不是‘%’, 則令 S 為只包含字符 C 的字符串 .否則 , C 是‘%’令 start 為 k.如果 k + 2 大于或等于 strLen, 拋出一個 URIError 異常 .如果 string 的 (k+1) 和 (k + 2) 位置的字符沒有表示為 16 進制數(shù)字,則拋出一個 URIError 異常 .令 B 為 (k + 1) 和 (k + 2) 位置的兩個 16 進制數(shù)字表示的 8 位值 .k 遞增 2.如果 B 的最高有效位是 0, 則令 C 為代碼單元值是 B 的字符 .如果 C 不在 reservedSet 里 , 則令 S 為只包含字符 C 的字符串 .否則 , C 在 reservedSet 里令 S 為 string 的從位置 start 到位置 k 的子字符串 .否則 , B 的最高有效位是 1令 n 為滿足 (B << n) & 0x80 等于 0 的最小非負數(shù) .如果 n 等于 1 或 n 大于 4, 拋出一個 URIError 異常 .令 Octets 為一個長度為 n 的 8 位整數(shù)排列 .將 B 放到 Octets 的 0 位置 .如果 k + (3 * (n – 1)) 大于或等于 strLen, 拋出一個 URIError 異常 .令 j 為 1.重復(fù) , 直到 j < nk 遞增 1.如果 string 的 k 位置的字符不是‘%’, 拋出一個 URIError 異常 .如果 string 的 (k +1) 和 (k+2) 位置的字符沒有表示為 16 進制數(shù)字 , 拋出一個 URIError 異常 .令 B 為 string 的 (k +1) 和 (k+2) 位置的兩個 16 進制數(shù)字表示的 8 位值 .如果 B 的兩個最高有效位不是 10,拋出一個 URIError 異常 .k 遞增 2.將 B 放到 Octets 的 j 位置 .j 遞增 1.令 V 為給 Octets 執(zhí)行 UTF-8 轉(zhuǎn)換得到的值,這是從一個字節(jié)排列到一個 32 位值的過程。 如果 Octets 不包含有效的 UTF-8 編碼的 Unicode 代碼點,則拋出一個 URIError 異常 .如果 V 小于 0x10000, 則令 C 為代碼單元值是 V 的字符 .如果 C 不在 reservedSet 里 , 則令 S 為只包含字符 C 的字符串 .否則 , C 在 reservedSet 里令 S 為 string 的從位置 start 到位置 k 的子字符串 .否則 , V ≥ 0x10000令 L 為 (((V – 0x10000) & 0x3FF) + 0xDC00).令 H 為 ((((V – 0x10000) >> 10) & 0x3FF) + 0xD800).令 S 為代碼單元值是 H 和 L 的兩個字符組成的字符串 .
  5. 令 R 為之前的 R 和 S 連接成的新字符串 .
  6. k 遞增 1.

 統(tǒng)一資源標識符的語法由 RFC 2396 給出,這里并沒有反應(yīng)更新的替換了 RFC 2396 的 RFC 3986。RFC 3629 給出了實現(xiàn) UTF-8 的正式描述。

 在 UTF-8 中,用 1 到 6 個字節(jié)的序列來編碼字符。只有“序列”中高階位設(shè)置為 0 的字節(jié),其余的 7 位才用于編碼字符值。在一個 n 個字節(jié)的序列中,n>1,初始字節(jié)有 n 個設(shè)置為 1 的高階位,其后的位設(shè)置為 0。這個字節(jié)的其他位包含是用來編碼字符的比特。后面跟著的其字節(jié)都包含設(shè)定為 1 的高階位,并且都跟著設(shè)定為 0 的位,剩下的 6 位都用作編碼字符。表 21 指定了 ECMAScript 字符可能的 UTF-8 編碼。

UTF-8編碼
字符編碼值表示第1十六進制位第2六進制位第3十六進制位第4十六進制位
0x0000 - 0x007F00000000 0zzzzzzz0zzzzzzz
0x0080 - 0x07FF00000yyy yyzzzzzz110yyyyy10zzzzzz
0x0800 - 0xD7FFxxxxyyyy yyzzzzzz1110xxxx10yyyyyy10zzzzzz
0xD800 - 0xDBFF 后跟 0xDC00 - 0xDFFF110110vv vvwwwwxx后跟110111yy yyzzzzzz11110uuu10uuwwww10xxyyyy10zzzzzz
0xD800 - 0xDBFF 后無 0xDC00 - 0xDFFF導(dǎo)致URIError
0xDC00 - 0xDFFF導(dǎo)致URIError
0xE000 - 0xFFFFxxxxyyyy yyzzzzzz1110xxxx10yyyyyy10zzzzzz

 在這里

 uuuuu = vvvv + 1

 來訪問附加的作為代理項的 0x10000,在 Unicode 標準 3.7 章節(jié)。

 0xD800-0xDFFF 范圍的代碼單元值用來編碼代理對;如上將 UTF-16 代理對轉(zhuǎn)換組合成一個 UTF-32 表示,并編碼 UTF-8 值的 21 位結(jié)果。解碼重建代理對。

 RFC 3629 禁止對無效 UTF-8 字節(jié)序列的解碼。例如,無效序列 C0 80 不能解碼成字符 U+0000。當 Decode 算法的實現(xiàn)遇到這樣的無效序列必須拋出一個 URIError 異常。

decodeURI (encodedURI)

 decodeURI 函數(shù)計算出一個新版 URI,將 URI 中可能是 encodeURI 函數(shù)引入的每個轉(zhuǎn)義序列和 UTF-8 編碼組替換為代表它們的字符。不是 encodeURI 導(dǎo)入的轉(zhuǎn)義序列不會被替換。

 當以一個參數(shù) encodedURI 調(diào)用 decodeURI 函數(shù),采用如下步驟:

  1. 令 uriString 為 ToString(encodedURI).
  2. 令 reservedURISet 為一個字符串,包含 uriReserved 的每個有效字符加上 "#" 的實例。
  3. 返回調(diào)用 Decode(uriString, reservedURISet) 的結(jié)果。

 "#" 字符不會從轉(zhuǎn)義序列中解碼,即使它不是 URI 保留字符。

decodeURIComponent (encodedURIComponent)

 decodeURIComponent 函數(shù)計算出一個新版 URI,將 URI 中可能是 encodeURIComponent 函數(shù)引入的每個轉(zhuǎn)義序列和 UTF-8 編碼組替換為代表它們的字符。

 當以一個參數(shù) encodedURIComponent 調(diào)用 decodeURIComponent 函數(shù),采用如下步驟:

  1. 令 componentString 為 ToString(encodedURIComponent).
  2. 令 reservedURIComponentSet 為一個空字符串。
  3. 返回調(diào)用 Decode(componentString, reservedURIComponentSet) 的結(jié)果。

encodeURI (uri)

 encodeURI 函數(shù)計算出一個新版 URI,將 URI 中某些字符的每個實例替換為代表這些字符 UTF-8 編碼的一個,兩個或三個轉(zhuǎn)義序列。

 當以一個參數(shù) uri 調(diào)用 encodeURI 函數(shù),采用如下步驟:

  1. 令 uriString 為 ToString(uri).
  2. 令 unescapedURISet 為一個字符串,包含 uriReserved 和 uriUnescaped 的每個有效字符加上 "#" 的實例。
  3. 返回調(diào)用 Encode(uriString, unescapedURISet) 的結(jié)果。

 字符 "#" 不會被編碼為一個轉(zhuǎn)義序列,即使它不是 URI 保留字符或非轉(zhuǎn)義字符。

encodeURIComponent (uriComponent)

 encodeURIComponent 函數(shù)計算出一個新版 URI,將 URI 中某些字符的每個實例替換為代表這些字符 UTF-8 編碼的一個,兩個或三個轉(zhuǎn)義序列。

 當以一個參數(shù) uriComponent 調(diào)用 encodeURIComponent 函數(shù),采用如下步驟:

  1. 令 componentString 為 ToString(uriComponent).
  2. 令 unescapedURIComponentSet 為一個字符串,包含 uriUnescaped 的每個有效字符的實例。
  3. 返回調(diào)用 Encode(componentString, unescapedURIComponentSet) 的結(jié)果。

全局對象的構(gòu)造器屬性

Object ( . . . )

 見 15.2.1 和 15.2.2.

Function ( . . . )

 見 15.3.1 和 15.3.2

Array ( . . . )

 見 15.4.1 和 15.4.2.

String ( . . . )

 見 15.5.1 和 15.5.2.

Boolean ( . . . )

 見 15.6.1 和 15.6.2.

Number ( . . . )

 見 15.7.1 和 15.7.2.

Date ( . . . )

 見 15.9.2.

RegExp ( . . . )

 見 15.10.3 和 15.10.4.

Error ( . . . )

 見 15.11.1 和 15.11.2.

EvalError ( . . . )

 見 15.11.6.1.

RangeError ( . . . )

 見 15.11.6.2.

ReferenceError ( . . . )

 見 15.11.6.3.

SyntaxError ( . . . )

 見 15.11.6.4.

TypeError ( . . . )

 見 15.11.6.5.

URIError ( . . . )

 見 15.11.6.6.

全局對象的其他屬性

Math

 見 15.8.

JSON

 見 15.12.


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號