ES5 標準對象說明


Contents

全局對象

唯一的全局對象在控制進入任何執行環境前被創建。

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

全局對象沒有 [[Construct]] 內部屬性 ; 全局對象不可能當做構造器用 new 運算符調用。

全局對象沒有 [[Call]] 內部屬性,全局對象不可能當做函數來調用。

全局對象的 [[Prototype]] [[Class]] 內部屬性值是依賴於實現的。

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


全局對象的值屬性

NaN

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

Infinity

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

undefined

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


全局對象的函數屬性

eval (x)

當用一個參數 x 調用 eval 函數,採用如下步驟:

  1. 如果 Type(x) 不是 String,返回 x
  2. prog 爲 ECMAScript 代碼,它是將 x 作爲一個程序解析的結果。如果解析失敗,拋出一個 SyntaxError 異常 ( 見 16 章 )。
  3. evalCtx 爲給 eval 代碼 prog 建立的新執行環境 (10.4.2)。V8.pngV8.png
  4. result 爲解釋執行程序 prog 的結果。
  5. 退出執行環境 evalCtx,恢復到之前的執行環境。
  6. 如果 result.typenormal 並且其完結類型值是 V,則返回 V 值。
  7. 如果 result.typenormal 並且其完結類型值是 empty,則返回 undefined 值。
  8. 否則,result.type 必定是 throw。將 result.value 作爲異常拋出。
直接調用 Eval

一個 eval 函數的直接調用是表示爲符合以下兩個條件的 CallExpression

解釋執行 CallExpression 中的 MemberExpression 的結果是個引用,這個引用擁有一個環境記錄項作爲其基值,並且這個引用的名稱是 "eval"Note.png

以這個引用作爲參數調用 GetValue 抽象操作的結果是 15.1.2.1 定義的標準內置函數。

parseInt (string, radix)

parseInt 函數產生一個根據 radix 來解釋 string 得到的整數值。Note.png string 開頭的空白會被忽略。如果 radixundefined 0,則將 radix 當作 10 處理 O.pngMoz.png,除非數字是以字符對 0x0X 開頭,在這種情形下將 radix 當作是 16。如果傳入的 radix 參數直接就是 16,那麼在數字前面加上 0x0X 也無妨。Note.png

當調用 parseInt 函數時,採用以下步驟:

  1. inputString ToString(string)。V8.png
  2. S 爲一個新創建的子字符串,它由 inputString 的第一個非 StrWhiteSpaceChar 字符和它後面跟着的所有字符組成。( 換句話說,刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符,則令 S 爲空字符串。
  3. sign1
  4. 如果 S 不爲空並且 S 的第一個字符是減號 -,則令 sign−1V8.png
  5. 如果 S 不是空並且 S 的第一個字符加號 + 或減號 -,則刪除 S 的第一個字符。
  6. R = ToInteger(radix)。
  7. stripPrefixtrue
  8. 如果 R0,則
    1. 如果 R < 2R > 36,則返回 NaNV8.png
    2. 如果 R16,令 stripPrefixfalse
  9. 否則,R = 0
    1. R = 10V8.png
  10. 如果 stripPrefixtrue,則
    1. 如果 S 長度大於 2 並且 S 的頭兩個字符是 “0x” 或 “0X”,則刪除 S 的頭兩個字符並且令 R = 16V8.png
  11. 如果 S 包含任何不是 R進制 數位的字符 Note.png,則令 ZS 中這樣的字符之前的所有字符組成的子字符串;否則令 ZS Note.pngV8.png
  12. 如果 Z 是空,返回 NaNV8.png
  13. mathIntZR進制 表示的數學值,用字母 A-Za-z 來表示 1035 之間的值。( 但如果 R10 並且 Z 包含多餘 20 位的值,可以替換 20 位後的每個數字爲 0,這是實現可選的功能;如果 R 不是 248101632,則 mathInt 可以是 ZR進制 表示的依賴於實現的近似值。)
  14. numbermathIntNumber 值。
  15. 返回 sign × numberV8.png
注:parseInt 可以只把 string 的開頭部分解釋爲整數值;它會忽略所有不能解釋爲整數記法的一部分的字符,並且沒有指示會給出任何這些忽略的字符。

parseFloat (string)

parseFloat 函數根據 string 參數的內容解釋爲十進制字面量的結果來決定,產生一個數值。

當調用 parseFloat 函數,採用以下步驟:

  1. inputString ToString(string)。
  2. trimmedString 爲一個新創建的子字符串,它由 inputString 的非 StrWhiteSpaceChar 字符的最左邊字符和它右邊跟着的所有字符組成。( 換句話說,刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符,則令 trimmedString 爲空字符串。
  3. 如果 trimmedStringtrimmedString 的任何前綴都不滿足 StrDecimalLiteral 的語法,返回 NaN
  4. numberString 爲滿足 StrDecimalLiteral 語法的 trimmedString 的最長前綴,可能是 numberString 自身。
  5. 返回 numberString 數學值的 Number 值。
注: parseFloat 可以只把 string 的開頭部分解釋爲數值;它會忽略所有不能解釋爲數值字面量記法的一部分的字符,並且沒有指示會給出任何這些忽略的字符。

isNaN (number)

如果指定參數爲 NaN,則返回 true,否則返回 false

  1. 如果 ToString(number) 是 NaN,返回 trueV8.png
  2. 否則 ,返回 false
注: 一個用 ECMAScript 代碼來測試值 X 是否是 NaN 的方式是使用表達式 X !== X。僅當 XNaN 時結果纔是 true

isFinite (number)

如果指定參數爲 NaN+∞−∞,則返回 false,否則返回 true

  1. 如果 ToNumber(number) 是 NaN+∞ −∞,返回 falseV8.png
  2. 否則,返回 true

處理 URI 的函數屬性


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

注: 許多 ECMAScript 實現提供額外的函數,方法來操作網頁;這些函數超出了本標準的範圍。

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

Scheme : First / Second ; Third ? Fourth

其中斜體的名字代表組件;“:”, “/”, “;”,“?”是當作分隔符的保留字符。encodeURI decodeURI 函數操作的是完整的 URI;這倆函數假定 URI 中的任何保留字符都有特殊意義,所有不會編碼它們。encodeURIComponent decodeURIComponent 函數操作的是組成 URI 的個別組件;這倆函數假定任何保留字符都代表普通文本,所以必須編碼它們,所以它們出現在組成一個完整 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 引入的更改沒有反應在這裏。

當 URI 裏包含一個沒在上面列出的字符或有時不想讓給定的保留字符有特殊意義,那麼必須編碼這個字符。字符被轉換成 UTF-8 編碼,首先從 UT​​F-16 轉換成相應的代碼點值的替代。(注:對於 [0,127] 範圍的代碼單元,轉換到單字節時它們的值是相同的。)然後返回的字節序列轉換爲一個字符串,每個字節用一個“%xx”形式的轉移序列表示。

描述編碼和轉義過程的抽象操作 Encode 需要兩個字符串參數 stringunescapedSet

  1. strLenstring 的字符個數。
  2. R 爲空字符串。
  3. k0
  4. 重複
    1. 如果 k 等於 strLen,返回 R
    2. Cstring 中位置爲 k 的字符。
    3. 如果 CunescapedSet 裏,則
      1. S 爲一個只包含字符 C 的字符串。
      2. R 爲之前 R 的值和 S 連接得到的一個新字符串值。
    4. 否則,C 不在 unescapedSet
      1. 如果 C 的代碼單元值不小於 0xDC00 並且不大於 0xDFFF,則拋出一個 URIError 異常。Note.png
      2. 如果 C 的代碼單元值小於 0xD800 或大於 0xDBFF,則 Note.png
        1. VC 的代碼單元值。
      3. 否則 Note.png
        1. k 遞增 1
        2. 如果 k 等於 strLen,拋出一個 URIError 異常。 Note.png
        3. kCharstringk 位置的字符的代碼單元值。
        4. 如果 kChar 小於 0xDC00 或大於 0xDFFF,則拋出一個 URIError 異常。Note.png
        5. V 爲 (((C的代碼單元值 ) – 0xD800) * 0x400 + (kChar0xDC00) + 0x10000)。Note.png
      4. OctetsV 執行 UTF-8 轉換的結果字節數組,令 L 爲這個字節數組的長度。
      5. j0
      6. 只要 j < L,就重複
        1. jOctetOctetsj 位置的值。
        2. S 爲一個包含三個字符“%XY”的字符串,這裏 XY 是編碼 jOctet 值的兩個大寫16進制數字。
        3. R 爲之前 R 的值和 S 連接得到的一個新字符串值。
        4. j 遞增 1
    5. k 遞增 1


描述反轉義和解碼過程的抽象操作 Decode 需要兩個字符串參數 stringreservedSet

  1. strLenstring 的字符個數。
  2. R 爲空字符串。
  3. k0
  4. 重複
    1. 如果 k 等於 strLen,返回 R
    2. Cstringk 位置的字符。
    3. 如果 C 不是‘%’,則
      1. S 爲只包含字符 C 的字符串。
    4. 否則,C 是‘%
      1. startk
      2. 如果 k + 2 大於或等於 strLen,拋出一個 URIError 異常。 Note.png
      3. 如果 string 的 (k + 1) 和 (k + 2) 位置的字符沒有表示爲16進制數字,則拋出一個 URIError 異常。Note.png
      4. B 爲 (k + 1) 和 (k + 2) 位置的兩個16進制數字表示的8位值。
      5. k 遞增 2.
      6. 如果 B 的最高有效位是 0,則 Note.png
        1. C 爲代碼單元值是 B 的字符。
        2. 如果 C 不在 reservedSet 裏,則
          1. S 爲只包含字符 C 的字符串。
        3. 否則,CreservedSet
          1. Sstring 的從位置 start 到位置 k 的子字符串。
      7. 否則,B 的最高有效位是 1 Note.png
        1. n 爲滿足 (B << n) & 0x80 等於 0 的最小非負數。Note.png
        2. 如果 n 等於 1n 大於 4,拋出一個 URIError 異常。Note.png
        3. Octets 爲一個長度爲 n 的字節數組。
        4. B 放到 Octets0 位置。
        5. 如果 k + (3 * (n1)) 大於或等於 strLen,拋出一個 URIError 異常。Note.png
        6. j1
        7. 重複,直到 j < n
          1. k 遞增 1
          2. 如果 stringk 位置的字符不是‘%’,拋出一個 URIError 異常。
          3. 如果 string 的 (k + 1) 和 (k + 2) 位置的字符沒有表示爲16進制數字,拋出一個 URIError 異常。
          4. Bstring 的 (k + 1') 和 (k + 2) 位置的兩個16進制數字表示的8位值。
          5. 如果 B 的兩個最高有效位不是二進制的 10,拋出一個 URIError 異常。Note.png
          6. k 遞增 2
          7. B 放到 Octetsj 位置。
          8. j 遞增 1
        8. V 爲給 Octets 執行 UTF-8 轉換得到的值,這是從一個字節數組到一個21位值的轉換過程。Note.png如果 Octets 不包含有效的 UTF-8 編碼的 Unicode 代碼點,則拋出一個 URIError 異常。
        9. 如果 V 小於 0x10000,則 Note.png
          1. C 爲代碼單元值是 V 的字符。
          2. 如果 C 不在 reservedSet 裏,則
            1. S 爲只包含字符 C 的字符串。
          3. 否則,CreservedSet
            1. Sstring 的從位置 start 到位置 k 的子字符串。
        10. 否則,V0x10000 Note.png
          1. L 爲 (((V0x10000) & 0x3FF) + 0xDC00)。
          2. H 爲 ((((V0x10000) >> 10) & 0x3FF) + 0xD800)。
          3. S 爲代碼單元值是 HL 的兩個字符組成的字符串。
  5. R 爲之前的 RS 連接成的新字符串。
  6. k 遞增 1
注: 統一資源標識符的語法由 RFC 2396 給出,這裏並沒有反應更新的替換了 RFC 2396 RFC 3986RFC 3629 給出了實現 UTF-8 的正式描述。

在 UTF-8 中,用 1 到 6 個位的字節序列來編碼字符。只有“序列”中高階位設置爲 0 的字節,其餘的 7 位才用於編碼字符值。在一個 n 個字節的序列中,n > 1,初始字節有 n 個設置爲 1 的高階位,其後的一位設置爲 0。這個字節的其它位包含了字符編碼的位。隨後的其它字節都是最高位爲 1、次高位爲 0、剩下的 6 位爲字符編碼。表21 指定了 ECMAScript 字符可能的 UTF-8 編碼。


表21 — UTF-8 Encodings
單位代碼值 表現 第一字節 第二字節 第三字節 第四字節
0x0000 - 0x007F 00000000 0zzzzzzz 0zzzzzzz      
0x0080 - 0x07FF 00000yyy yyzzzzzz 110yyyyy 10zzzzzz    
0x0800 - 0xD7FF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz  
0xD800 - 0xDBFF
挨着
0xDC00 - 0xDFFF
110110vv vvwwwwxx
挨着
110111yy yyzzzzzz
11110uuu 10uuwwww 10xxyyyy 10zzzzzz
0xD800 - 0xDBFF
不挨着
0xDC00 - 0xDFFF
引發URIError        
0xDC00 - 0xDFFF 引發URIError        
0xE000 - 0xFFFF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz  

在這裏

uuuuu = vvvv + 1

以補足替代符的 0x10000 附加值,在 Unicode 標準 3.7 章節。


0xD800-0xDFFF 範圍的代碼單元值用來編碼替代符對;如上將 UTF-16 替代符對轉換組合成一個 UTF-32 表示法,並將其編碼到一個 UTF-8 的21位值中。這就是替代符對的解碼方式。 Note.png

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


decodeURI (encodedURI)

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

當以一個參數 encodedURI 調用 decodeURI 函數,採用如下步驟:

  1. uriString ToString(encodedURI)。V8.png
  2. reservedURISet 爲一個包含 uriReserved 中的所有字符組成的字符串連接上 "#" 組成的字符串。
  3. 返回調用 Decode(uriString, reservedURISet) 的結果。
注: "#" 字符不會從轉義序列中解碼,即使它不是 URI 保留字符。


decodeURIComponent (encodedURIComponent)

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

當以一個參數 encodedURIComponent 調用 decodeURIComponent 函數,採用如下步驟:

  1. componentString ToString(encodedURIComponent)。V8.png
  2. reservedURIComponentSet 爲一個空字符串。
  3. 返回調用 Decode(componentString, reservedURIComponentSet) 的結果。


encodeURI (uri)

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

當以一個參數 uri 調用 encodeURI 函數,採用如下步驟:

  1. uriString ToString(uri)。V8.png
  2. unescapedURISet 爲一個包含 uriReserved uriUnescaped 中所有字符組成的字符串連接上 "#" 組成的字符串。
  3. 返回調用 Encode(uriString, unescapedURISet) 的結果。
注: 字符 "#" 不會被編碼爲一個轉義序列,即使它不是 URI 保留字符或非轉義字符。


encodeURIComponent (uriComponent)

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

當以一個參數 uriComponent 調用 encodeURIComponent 函數,採用如下步驟:

  1. componentString ToString(uriComponent)。V8.png
  2. unescapedURIComponentSet 爲一個包含 uriUnescaped 中所有字符組成的字符串。
  3. 返回調用 Encode(componentString, unescapedURIComponentSet) 的結果。

全局對象的構造器屬性

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.

Object 對象


作爲函數調用 Object 構造器

當把 Object 當做一個函數來調用,而不是一個構造器,它會執行一個類型轉換。


Object ( [ value ] )

當以一個參數 value 或者無參數調用 Object 函數,採用如下步驟:

  1. 如果 valuenullundefined 或未指定,則創建並返回一個新 Object 對象,這個對象與彷彿用相同參數調用標準內置的 Object 構造器 (15.2.2.1) 的結果一樣。V8.png
  2. 返回 ToObject(value)。V8.png


Object 構造器

Objectnew 表達式調用的一部分時,它是一個構造器,可創建一個對象。


new Object ( [ value ] )

當以一個參數 value 或者無參數調用 Object 構造器,採用如下步驟:

  1. 如果提供了 value,則
    1. 如果 Type(value) 是 Object,則
      1. 如果 value 是個原生 ECMAScript 對象,不創建新對象,簡單的返回 value
      2. 如果 value 是宿主對象,則採取動作和返回依賴實現的結果的方式可以使依賴於宿主對象的。
    2. 如果 Type(value) 是 String,返回 ToObject(value)。
    3. 如果 Type(value) 是 Boolean,返回 ToObject(value)。
    4. 如果 Type(value) 是 Number,返回 ToObject(value)。
  2. 斷言:未提供參數 value 或其類型是 NullUndefined
  3. obj 爲一個新創建的原生 ECMAScript 對象。
  4. 設定 obj [[Prototype]] 內部屬性爲標準內置的 Objectprototype 對象 (15.2.4)。
  5. 設定 obj [[Class]] 內部屬性爲 "Object"
  6. 設定 obj [[Extensible]] 內部屬性爲 true
  7. 設定 obj 8.12 指定的所有內部方法
  8. 返回 obj


Object 構造器的屬性

Object 構造器的 [[Prototype]] 內部屬性值是標準內置 Functionprototype 對象。

除了內部屬性和 length 屬性(其值是 1)之外,Object 構造器擁有以下屬性:


Object.prototype

Object.prototype 的初始值是標準內置 Object prototype 對象(15.2.4)。

這個屬性包含特性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }


Object.getPrototypeOf ( O )

當以參數 O 調用 getPrototypeOf 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. 返回 O [[Prototype]] 內部屬性的值。V8.png


Object.getOwnPropertyDescriptor ( O, P )

當調用 getOwnPropertyDescriptor 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. name ToString(P)。
  3. desc 爲以參數 name 調用 O [[GetOwnProperty]] 內部方法的結果。V8.png
  4. 返回調用 FromPropertyDescriptor(desc) 的結果。


Object.getOwnPropertyNames ( O )

當調用 getOwnPropertyNames 函數,採用如下步驟:Note.png

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. array 爲彷彿是用表達式 new Array () 創建新對象的結果,這裏的 Array 是標準內置構造器名。
  3. n0
  4. O 的每個自身屬性 P
    1. name 爲值是 P 的名稱的字符串。
    2. ToString(n) 和屬性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 爲參數調用 array [[DefineOwnProperty]] 內部方法。V8.png
    3. n 遞增 1
  5. 返回 array
注: 如果 O 是一個字符串實例,第4步 處理的自身屬性集合包含 15.5.5.2 定義的隱藏屬性,他們對應對象的 [[PrimitiveValue]] 字符串中相應位置的字符。


Object.create ( O [, Properties] )

create 函數按照指定的原型創建一個新對象。當調用 create 函數,採用如下步驟:

  1. 如果 Type(O) 不是 ObjectNull,則拋出一個 TypeError 異常。V8.png
  2. obj 爲彷彿是用表達式 new Object() 創建新對象的結果,這裏的 Object 是標準內置構造器名。 V8.png
  3. 設定 obj [[Prototype]] 內部屬性爲 OV8.png
  4. 如果傳入了 Properties 參數並且不是 undefined,則彷彿是用 objProperties 當作參數調用標準內置函數 Object.defineProperties 一樣給 obj 添加自身屬性。V8.png
  5. 返回 obj


Object.defineProperty ( O, P, Attributes )

defineProperty 函數用於給一個對象添加一個自身屬性以及更新現有自身屬性的特性。當調用 defineProperty 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. name ToString(P)。
  3. desc 爲以 Attributes 作爲參數調用 ToPropertyDescriptor 的結果。V8.png
  4. namedesctrue 作爲參數調用 O [[DefineOwnProperty]] 內部方法 .V8.png
  5. 返回 O


Object.defineProperties ( O, Properties )

defineProperties 函數用於給一個對象添加一些自身屬性以及更新現有的一些自身屬性的特性。當調用 defineProperties 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. props ToObject(Properties)。V8.png
  3. names 爲一個內部列表,它包含 props 的每個可遍歷自身屬性的名稱。
  4. descriptors 爲一個空的內部列表。
  5. names 的每個元素 P,按照列表順序 ,
    1. descObj 爲以 P 作爲參數調用 props [[Get]] 內部方法的結果。
    2. desc 爲以 descObj 作爲參數調用 ToPropertyDescriptor 的結果。
    3. desc 插入 descriptors 的尾部。
  6. descriptors 的每個元素 desc,按照列表順序 ,
    1. 以參數 Pdesctrue 調用 O [[DefineOwnProperty]] 內部方法。V8.png
  7. 返回 O

如果一個實現爲 for-in 語句 的定義了特定的枚舉順序,那麼在這個算法的 第3步 中的列表元素必須也用相同的順序排列。


Object.seal ( O )

當調用 seal 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. O 的每個命名自身屬性名 P,
    1. desc 爲以參數 P 調用 O [[GetOwnProperty]] 內部方法的結果。V8.png
    2. 如果 desc.[[Configurable]]true,設定 desc.[[Configurable]]falseV8.png
    3. Pdesctrue 爲參數調用 O [[DefineOwnProperty]] 內部方法。
  3. 設定 O [[Extensible]] 內部屬性爲 falseV8.png
  4. 返回 O


Object.freeze ( O )

當調用 freeze 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. O 的每個命名自身屬性名 P,
    1. desc 爲以參數 P 調用 O [[GetOwnProperty]] 內部方法的結果。V8.png
    2. 如果 IsDataDescriptor(desc) 是 true,則
      1. 如果 desc.[[Writable]]true,設定 desc[[Writable]]false.V8.png
    3. 如果 desc.[[Configurable]]true,設定 desc[[Configurable]]false
    4. Pdesctrue 作爲參數調用 O [[DefineOwnProperty]] 內部方法。
  3. 設定 O [[Extensible]] 內部屬性爲 falseV8.png
  4. 返回 O


Object.preventExtensions ( O )

當調用 preventExtensions 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .V8.png
  2. 設定 O [[Extensible]] 內部屬性爲 falseV8.png
  3. 返回 O


Object.isSealed ( O )

當以參數 O 調用 isSealed 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. O 的每個命名自身屬性名 P
    1. desc 爲以參數 P 調用 O [[GetOwnProperty]] 內部方法的結果 .V8.png
    2. 如果 desc.[[Configurable]]true,則返回 false
  3. 如果 O [[Extensible]] 內部屬性是 false,則返回 true
  4. 否則,返回 false


Object.isFrozen ( O )

當以參數 O 調用 isFrozen 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. O 的每個命名自身屬性名 P,
    1. desc 爲以參數 P 調用 O [[GetOwnProperty]] 內部方法的結果 .
    2. 如果 IsDataDescriptor(desc) 是 true,則
      1. 如果 desc.[[Writable]]true,則返回 false
    3. 如果 desc.[[Configurable]]true,則返回 false
  3. 如果 O [[Extensible]] 內部屬性是 false,則返回 true
  4. 否則,返回 false


Object.isExtensible ( O )

當以參數 O 調用 isExtensible 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. 返回 O [[Extensible]] 內部屬性布爾值。V8.pngV8.png


Object.keys ( O )

當以參數 O 調用 keys 函數,採用如下步驟:

  1. 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。V8.png
  2. nO 的可遍歷自身屬性的個數
  3. array 爲彷彿是用表達式 new Array() 創建新對象的結果,這裏的 Array 是標準內置構造器名。
  4. index0
  5. O 的每個可遍歷自身屬性名 PNote.png
    1. ToString(index),屬性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作爲參數調用 array 的 [[DefineOwnProperty]] 內部方法。
    2. index 遞增 1
  6. 返回 array

如果一個實現爲 for-in 語句 的定義了特定的枚舉順序,那麼在這個算法的 第5步 中的必須使用相同的枚舉順序。


Object 的 prototype 對象的屬性

Objectprototype 對象的 [[Prototype]] 內部屬性的值是 null Note.png[[Class]] 內部屬性的值是 "Object"[[Extensible]] 內部屬性的初始值是 true


Object.prototype.constructor

Object.prototype.constructor 的初始值是標準內置的 Object 構造器。


Object.prototype.toString ( )

當調用 toString 方法,採用如下步驟:Note.png

  1. 如果 this 的值是 undefined,返回 "[object Undefined]"V8.png
  2. 如果 this 的值是 null,返回 "[object Null]"V8.png
  3. O 爲以 this 作爲參數調用 ToObject 的結果。
  4. classO [[Class]] 內部屬性的值。V8.png
  5. 返回三個字符串 "[object "class"]" 連起來的字符串。


Object.prototype.toLocaleString ( )

當調用 toLocaleString 方法,採用如下步驟:

  1. O 爲以 this 作爲參數調用 ToObject 的結果。
  2. toString 爲以 "toString" 作爲參數調用 O [[Get]] 內部方法的結果.
  3. 如果 IsCallable(toString) 是 false,拋出一個 TypeError 異常。V8.png
  4. 返回以 O 作爲 this 值,無參數調用 toString [[Call]] 內部方法的結果。
注: 這個函數給所有 Object 對象提供一個通用的 toLocaleString 接口,即使並不是所有的都使用它。目前,ArrayNumberDate 都提供了它們自身的語言環境敏感的 toLocaleString 方法。
注: 這個函數的第一個參數可能會在此標準的未來版本中使用到;因此建議實現不要用這個位置參數來做其他事情。


Object.prototype.valueOf ( )

當調用 valueOf 方法,採用如下步驟:

  1. O 爲以 this 作爲參數調用 ToObject 的結果。V8.png
  2. 如果 O 是以一個宿主對象 (15.2.2.1) 爲參數調用 Object 構造器的結果,則
    1. 返回 O 或返回先前傳遞給構造器的原宿主對象。返回的具體結果是由實現定義的。
  3. 返回 O


Object.prototype.hasOwnProperty (V)

當以參數 V 調用 hasOwnProperty 方法,採用如下步驟:

  1. P ToString(V)。V8.png
  2. O 爲以 this 值作爲參數調用 ToObject 的結果。
  3. desc 爲以 P 爲參數調用 O [[GetOwnProperty]] 內部方法的結果。
  4. 如果 descundefined,返回 false
  5. 返回 true
注: 不像 [[HasProperty]](8.12.6),這個方法不考慮原形鏈中的對象。
注: 第1步第2步 選擇這樣的順序是爲了確保,即使 this 值是 undefinednull,本規範之前版本中任何會在 第1步 拋出的異常,都會繼續在本規範中拋出。Note.png


Object.prototype.isPrototypeOf (V)

當以參數 V 調用 isPrototypeOf 方法,採用如下步驟:

  1. 如果 V 不是個對象,返回 false
  2. O 爲以 this 作爲參數調用 ToObject 的結果。V8.png
  3. 重複
    1. VV [[Prototype]] 內部屬性的值。V8.png
    2. 如果 Vnull,返回 false
    3. 如果 OV 指向同一個對象,返回 true
注: 第1步第2步 選擇這樣的順序是爲了,當 V 不是對象並且 this 值是 undefinednull 時能夠保持本規範之前版本指定的行爲。


Object.prototype.propertyIsEnumerable (V)

當以參數 V 調用 propertyIsEnumerable 方法,採用如下步驟:

  1. P ToString(V)。V8.png
  2. O 爲以 this 作爲參數調用 ToObject 的結果。
  3. desc 爲以 P 作爲參數調用 O [[GetOwnProperty]] 內部方法的結果。V8.png
  4. 如果 descundefined,返回 false
  5. 返回 desc.[[Enumerable]] 的值。
注: 這個方法不考慮原型鏈中的對象。
注: 第1步第2步 選擇這樣的順序是爲了確保,即使 this 值是 undefinednull,本規範之前版本中任何會在 第1步 拋出的異常,都會繼續在本規範中拋出。Note.png


Object 的實例的屬性

Object 的實例除了擁從 Objectprototype 對象繼承來的屬性之外不包含特殊的屬性。

Function 對象


作爲函數調用 Function 構造器

當將 Function 作爲函數來調用,而不是作爲構造器,它會創建並初始化一個新函數對象。所以函數調用 Function() 與用相同參數的 new Function() 表達式創建的對象相同。


Function (p1, p2, … , pn, body)

當以 p1p2、…、pnbody 作爲參數調用 Function 函數(這裏的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),採用如下步驟:

  1. 創建並返回一個新函數對象,它彷彿是用相同參數給標準內置構造器 Function (15.3.2.1). 用一個 new 表達式創建的。


Function 構造器

Function 作爲 new 表達式的一部分被調用時,它是一個構造器:它初始化新創建的對象。


new Function (p1, p2, … , pn, body)

最後一個參數指定爲函數的 body(可執行代碼);之前的任何參數都指定爲形式參數。

當以 p1p2、…、pnbody 作爲參數調用 Function 構造器(這裏的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),採用如下步驟:

  1. argCount 爲傳給這個函數調用的參數總數。
  2. P 爲空字符串。
  3. 如果 argCount = 0,令 body 爲空字符串。
  4. 否則如果 argCount = 1,令 body 爲那個參數。
  5. 否則,argCount > 1
    1. firstArg 爲第一個參數。
    2. P ToString( firstArg )。
    3. k2
    4. 只要 k < argCount 就重複
      1. nextArg 爲第 k 個參數。
      2. P 爲之前的 P 值,字符串 ","(一個逗號),ToString( nextArg ) 串聯的結果。V8.png
      3. k 遞增 1
    5. body 爲第 k 個參數。
  6. body ToString( body )。
  7. 如果 P 不可解析爲一個 FormalParameterList,則拋出一個 SyntaxError 異常。Note.png Note.png V8.png
  8. 如果 body 不可解析爲 FunctionBody,則拋出一個 SyntaxError 異常。Note.png V8.png
  9. 如果 body 是嚴格模式代碼 ( 見 10.1.1),則令 stricttrue,否則令 strict false
  10. 如果 stricttrue,適用 13.1 指定拋出的任何異常。
  11. 返回一個新創建的函數對象,它是依照 13.2 專遞 P 作爲 FormalParameterListbody 作爲 FunctionBody全局環境作爲 Scope 參數、strict 作爲嚴格模式標誌。

每個函數都會自動創建一個 prototype 屬性,用來支持函數被當做構造器使用的可能性。

注: 爲每個形參指定一個參數是允許的,但沒必要。例如以下三個表達式產生相同的結果:
 new Function("a", "b", "c", "return a+b+c")
 new Function("a, b, c", "return a+b+c")
 new Function("a,b", "c", "return a+b+c")


Function 構造器的屬性

Function 構造器自身是個函數對象,它的 [[Class]]"Function"Function 構造器的 [[Prototype]] 內部屬性值是標準內置 Functionprototype 對象 (15.3.4)。

Function 構造器的 [[Extensible]] 內部屬性值是 true.

Function 構造器有如下屬性 :


Function.prototype

Function.prototype 的初始值是標準內置 Function prototype 對象 (15.3.4)。

此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Function.length

這是個值爲 1 的數據屬性。此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Function 的 prototype 對象的屬性

Functionprototype 對象自身是一個函數對象 ( 它的 [[Class]]"Function"),調用這個函數對象時,接受任何參數並返回 undefinedNote.png

Functionprototype 對象的 [[Prototype]] 內部屬性值是標準內置 Objectprototype 對象 (15.2.4)。Functionprototype 對象的 [[Extensible]] 內部屬性的初始值是 true

Functionprototype 對象自身沒有 valueOf 屬性 ; 但是,它從 Objectprototype 對象繼承了 valueOf 屬性。

Functionprototype 對象的 length 屬性是 0


Function.prototype.constructor

Function.prototype.constructor 的初始值是內置 Function 構造器。


Function.prototype.toString ( )

此函數的返回值的表示是依賴於實現的。這個表示包含 FunctionDeclaration 的語法。特別注意,怎樣在這個字符串表示中使用和放置空白、行終止符、分號,是依賴於實現的。 Note.png Ms.png

這個 toString 不是通用的;如果它的 this 值不是一個函數對象,它會拋出一個 TypeError 異常。因此,它不能當做方法來轉移到其他類型的對象中。V8.png


Function.prototype.apply (thisArg, argArray)

當以 thisArgargArray 爲參數在一個 func 對象上調用 apply 方法,採用如下步驟:

  1. 如果 IsCallable( func ) 是 false,則拋出一個 TypeError 異常。
  2. 如果 argArraynullundefined,則
    1. 返回提供 thisArg 作爲 this 值並以空參數列表調用 func [[Call]] 內部方法的結果。
  3. 如果 Type( argArray ) 不是 Object,則拋出一個 TypeError 異常。
  4. len 爲以 "length" 作爲參數調用 argArray [[Get]] 內部方法的結果。
  5. n ToUint32( len )。
  6. argList 爲一個空列表。
  7. index0
  8. 只要 index < n 就重複
    1. indexName ToString( index )。
    2. nextArg 爲以 indexName 作爲參數調用 argArray [[Get]] 內部方法的結果。
    3. nextArg 作爲最後一個元素插入到 argList 裏。
    4. 設定 indexindex + 1
  9. 提供 thisArg 作爲 this 值並以 argList 作爲參數列表,調用 func [[Call]] 內部方法,返回結果。

apply 方法的 length 屬性是 2

注: 在外面傳入的 thisArg 值會修改併成爲 this 值。thisArgundefinednull 時它會被替換成全局對象,所有其他值會被應用 ToObject 並將結果作爲 this 值,這是第三版引入的更改。


Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )

當以 thisArg 和可選的 arg1arg2 等等作爲參數在一個 func 對象上調用 call 方法,採用如下步驟:

  1. 如果 IsCallable(func) 是 false,則拋出一個 TypeError 異常。
  2. argList 爲一個空列表。
  3. 如果調用這個方法的參數多餘一個,則從 arg1 開始以從左到右的順序將每個參數插入爲 argList 的最後一個元素。
  4. 提供 thisArg 作爲 this 值並以 argList 作爲參數列表,調用 func [[Call]] 內部方法,返回結果。

call 方法的 length 屬性是 1

注: 在外面傳入的 thisArg 值會修改併成爲 this 值。thisArgundefinednull 時它會被替換成全局對象,所有其他值會被應用 ToObject 並將結果作爲 this 值,這是第三版引入的更改。

Function.prototype.bind (thisArg [, arg1 [, arg2, …]])

bind 方法需要一個或更多參數,thisArg 和(可選的)arg1arg2,等,執行如下步驟返回一個新函數對象:

  1. Targetthis 值 .
  2. 如果 IsCallable( Target ) 是 false,拋出一個 TypeError 異常 .V8.png
  3. A 爲一個(可能爲空的)新內部列表,它包含按順序的 thisArg 後面的所有參數(arg1arg2,等)。
  4. F 爲一個新原生 ECMAScript 對象。
  5. 依照 8.12 指定,設定 F 的除了 [[Get]] 之外的所有內部方法。
  6. 依照 15.3.5.4 指定,設定 F [[Get]] 內部屬性。
  7. 設定 F [[TargetFunction]] 內部屬性爲 Target
  8. 設定 F [[BoundThis]] 內部屬性爲 thisArg 的值。
  9. 設定 F [[BoundArgs]] 內部屬性爲 A
  10. 設定 F [[Class]] 內部屬性爲 "Function"
  11. 設定 F [[Prototype]] 內部屬性爲 15.3.3.1 指定的標準內置 Functionprototype 對象。
  12. 依照 15.3.4.5.1 描述,設定 F[[Call]] 內置屬性。
  13. 依照 15.3.4.5.2 描述,設定 F[[Construct]] 內置屬性。
  14. 依照 15.3.4.5.3 描述,設定 F[[HasInstance]] 內置屬性。
  15. 如果 Target [[Class]] 內部屬性是 "Function",則
    1. LTargetlength 屬性減 A 的長度。V8.png
    2. 設定 Flength 自身屬性爲 0L 中更大的值。
  16. 否則設定 Flength 自身屬性爲 0.
  17. 設定 Flength 自身屬性的特性爲 15.3.5.1 指定的值。
  18. 設定 F [[Extensible]] 內部屬性爲 true
  19. thrower [[ThrowTypeError]] 函數對象 (13.2.3)。
  20. "caller", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作爲參數調用 F 的 [[DefineOwnProperty]] 內部方法。
  21. "arguments", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作爲參數調用 F 的 [[DefineOwnProperty]] 內部方法。
  22. 返回 F.

bind 方法的 length 屬性是 1

注:Function.prototype.bind 創建的函數對象不包含 prototype 屬性或 [[Code]][[FormalParameters]][[Scope]] 內部屬性。


[[Call]]

當調用一個用 bind 函數創建的函數對象 F[[Call]] 內部方法,傳入一個 this 值和一個參數列表 ExtraArgs,採用如下步驟:

  1. boundArgsF [[BoundArgs]] 內部屬性值。
  2. boundThisF [[BoundThis]] 內部屬性值。
  3. targetF [[TargetFunction]] 內部屬性值。
  4. args 爲一個新列表,它包含與列表 boundArgs 相同順序相同值,後面跟着與 ExtraArgs 是相同順序相同值。
  5. 提供 boundThis 作爲 this 值,提供 args 爲參數調用 target [[Call]] 內部方法,返回結果。


[[Construct]]

當調用一個用 bind 函數創建的函數對象 F[[Construct]] 內部方法,傳入一個參數列表 ExtraArgs,採用如下步驟:

  1. targetF [[TargetFunction]] 內部屬性值。
  2. 如果 target 不包含 [[Construct]] 內部方法,拋出一個 TypeError 異常。
  3. boundArgsF [[BoundArgs]] 內部屬性值。
  4. args 爲一個新列表,它包含與列表 boundArgs 相同順序相同值,後面跟着與 ExtraArgs 是相同順序相同值。
  5. 提供 args 爲參數調用 target [[Construct]] 內部方法,返回結果。


[[HasInstance]] (V)

當調用一個用 bind 函數創建的函數對象 F[[HasInstance]] 內部方法,並以 V 作爲參數,採用如下步驟:

  1. targetF [[TargetFunction]] 內部屬性值。
  2. 如果 target 不包含 [[HasInstance]] 內部方法,拋出一個 TypeError 異常。
  3. 提供 V 爲參數調用 target [[HasInstance]] 內部方法,返回結果。


Function 的實例的屬性

除了必要的內部屬性之外,每個函數實例還有一個 [[Class]] 內部屬性並且在大多數情況下使用不同版本的 [[Call]] 內部屬性。函數實例根據怎樣創建的(見 8.6.213.21515.3.4.5)可能還有一個 [[HasInstance]] 內部屬性、一個 [[Scope]] 內部屬性、一個 [[Construct]] 內部屬性、一個 [[FormalParameters]] 內部屬性、一個 [[Code]] 內部屬性、一個 [[TargetFunction]] 內部屬性、一個 [[BoundThis]] 內部屬性、一個 [[BoundArgs]] 內部屬性。

[[Class]] 內部屬性的值是 "Function"

對應於嚴格模式函數 (13.2) 的函數實例和用 Function.prototype.bind 方法 (15.3.4.5) 創建的函數實例有名爲“caller”和 “arguments”的屬性時,拋出一個 TypeError 異常。一個 ECMAScript 實現不得爲在嚴格模式函數代碼裏訪問這些屬性關聯任何依賴實現的特定行爲。 V8.png


length

length 屬性值是個整數,它指出函數預期的“一般的”參數個數。然而,語言允許用其他數量的參數來調用函數。當以與函數的 length 屬性指定的數量不同的參數個數調用函數時,它的行爲依賴於函數自身。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


prototype

prototype 屬性的值用於初始化一個新創建對象的的 [[Prototype]] 內部屬性,爲了這個新創建對象要先將函數對象作爲構造器調用。這個屬性擁有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

注: 用 Function.prototype.bind 創建的函數對象沒有 prototype 屬性。


[[HasInstance]] (V)

F 是個函數對象。當以 V 作爲參數調用 F[[HasInstance]] 內部方法,採用如下步驟:

  1. 如果 V 不是個對象,返回 false
  2. O 爲用屬性名 "prototype" 調用 F [[Get]] 內部方法的結果。
  3. 如果 Type(O) 不是 Object,拋出一個 TypeError 異常。
  4. 重複
    1. VV [[Prototype]] 內部屬性值。
    2. 如果 Vnull,返回 false
    3. 如果 OV 指向相同對象,返回 true
注: 用 Function.prototype.bind 創建的函數對象擁有的不同的 [[HasInstance]] 實現,在 15.3.4.5.3 中定義。


[[Get]] (P)

函數對象與其他原生 EMACScript 對象 (8.12.3) 用不同的 [[Get]] 內部方法。

F 是一個函數對象,當以屬性名 P 調用 F[[Get]] 內部方法,採用如下步驟:

  1. v 爲傳入 P 作爲屬性名參數調用 F 的默認 [[Get]] 內部方法 (8.12.3) 的結果。
  2. 如果 P"caller" 並且 v 是個嚴格模式函數對象,拋出一個 TypeError 異常。
  3. 返回 v
注: 用 Function.prototype.bind 創建的函數對象使用默認的 [[Get]] 內部方法。

Array 對象

數組對象會給予一些特定種類的屬性名特殊待遇。對一個屬性名 P(字符串形式),當且僅當 ToString(ToUint32(P)) 等於 P 並且 ToUint32(P) 不等於 232 - 1 時,它是個數組索引。一個屬性名是數組索引的屬性還叫做元素 。所有數組對象都有一個 length 屬性,其值始終是一個小於 232 的非負整數。length 屬性值在數值上比任何名爲數組索引的屬性名稱還要大;每當創建或更改一個數組對象的屬性,都要調整其他屬性以保持上面那個條件不變。具體來說,每當添加一個名爲數組索引的屬性時,如果需要就更改 length 屬性爲在數值上比這個數組索引大 1 的值;每當更改 length 屬性,所有屬性名是數組索引並且其值不小於新 length 的屬性會被自動刪除。Note.png 這個限制只應用於數組對象的自身屬性,並且從原型中繼承的 length 或數組索引不影響這個限制。

對一個對象 O,如果以下算法返回 true,那麼就叫這個對象爲 稀疏 的:

  1. len 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
  2. 對每個範圍在 0i < ToUint32(len) 的整數 i
    1. elem 爲以 ToString(i) 作爲參數調用 O [[GetOwnProperty]] 內部方法的結果。
    2. 如果 elemundefined,返回 true
  3. 返回 false


作爲函數調用 Array 構造器

當將 Array 作爲函數來調用,而不是作爲構造器,它會創建並初始化一個新數組對象。所以函數調用 Array(…) 與用相同參數的 new Array(…) 表達式創建的對象相同。


Array ( [ item1 [ , item2 [ , … ] ] ] )

當調用 Array 函數,採用如下步驟:

  1. 創建並返回一個新函數對象,它彷彿是用相同參數給標準內置構造器 Array 用一個 new 表達式創建的 (15.4.2)。


Array 構造器

Array 作爲 new 表達式的一部分被調用時,它是一個構造器:它初始化新創建的對象。


new Array ( [ item0 [ , item1 [ , … ] ] ] )

當且僅當以無參數或至少兩個參數調用 Array 構造器時,適用這裏的描述。

新構造對象的 [[Prototype]] 內部屬性要設定爲原始的數組原型對象,他是 Array.prototype(15.4.3.1) 的初始值。

新構造對象的 [[Class]] 內部屬性要設定爲 "Array"

新構造對象的 [[Extensible]] 內部屬性要設定爲 true

新構造對象的 length 屬性要設定爲參數的個數。

新構造對象的 0 屬性要設定爲 item0(如果提供了);新構造對象的 1 屬性要設定爲 item1(如果提供了);更多的參數可應用普遍規律,新構造對象的 k 屬性要設定爲第 k 個參數,這裏的 k 是從 0 開始的。所有這些屬性都有特性 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。


new Array (len)

新構造對象的 [[Prototype]] 內部屬性要設定爲原始的數組原型對象,他是 Array.prototype(15.4.3.1) 的初始值。新構造對象的 [[Class]] 內部屬性要設定爲 "Array"。新構造對象的 [[Extensible]] 內部屬性要設定爲 true

如果參數 len 是個Number值 並且 ToUint32(len) 等於 len,則新構造對象的 length 屬性要設定爲 ToUint32(len)。如果參數 len 是個數字值並且 ToUint32(len) 不等於 len,則拋出一個 RangeError 異常。V8.png

如果參數 len 不是Number值,則新構造對象的 length 屬性要設定爲 0,並且新構造對象的 0 屬性要設定爲 len,設定它的特性爲 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。


Array 構造器的屬性

Array 構造器的 [[Prototype]] 內部屬性值是函數原型對象 (15.3.4)。

Array 構造器除了有一些內部屬性和 length 屬性(其值是 1)之外,還有如下屬性:


Array.prototype

Array.prototype 的初始值是數組原型對象 (15.4.4)。

此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Array.isArray ( arg )


isArray 函數需要一個參數 arg,如果參數是個對象並且 [[Class]] 內部屬性是 "Array",返回布爾值 true;否則它返回 false。採用如下步驟:

  1. 如果 Type(arg) 不是 Object,返回 false
  2. 如果 arg 的 [[Class]] 內部屬性值是 "Array",則返回 true
  3. 返回 false

數組原型對象的屬性


數組原型對象的 [[Prototype]] 內部屬性值是標準內置 Object 原型對象 (15.2.4)。

數組原型對象自身是個數組;它的 [[Class]]"Array",它擁有一個 length 屬性(初始值是 +0)和 15.4.5.1 描述的特殊的 [[DefineOwnProperty]] 內部方法。

在以下的對數組原型對象的屬性函數的描述中,短語“this 對象”指的是調用這個函數時的 this 值對象。允許 this [[Class]] 內部屬性值不是 "Array" 的對象。

注: 數組原型對象自身沒有 valueOf 屬性;但它從標準內置 Object 原型對象繼承 valueOf 屬性。


Array.prototype.constructor

Array.prototype.constructor 的初始值是標準內置 Array 構造器。


Array.prototype.toString ( )

當調用 toString 方法,採用如下步驟:V8.png

  1. array 爲用 this 值調用 ToObject 的結果。
  2. func 爲以 "join" 作爲參數調用 array [[Get]] 內部方法的結果。
  3. 如果 IsCallable(func) 是 false,則令 func 爲標準內置方法 Object.prototype.toString (15.2.4.2)。V8.png
  4. 提供 array 作爲 this 值並以空參數列表調用 func [[Call]] 內部方法,返回結果。
注: toString 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 toString 函數是依賴於實現的。


Array.prototype.toLocaleString ( )

先用數組元素的 toLocaleString 方法,將他們轉換成字符串。然後將這些字符串串聯,用一個分隔符分割,這裏的分隔符字符串是與特定語言環境相關,由實現定義的方式得到的。調用這個函數的結果除了與特定語言環境關聯之外,與 toString 的結果類似。

結果是按照一下方式計算的:V8.png

  1. array 爲以 this 值作爲參數調用 ToObject 的結果。
  2. arrayLen 爲以 "length" 作爲參數調用 array [[Get]] 內部方法的結果。
  3. len ToUint32(arrayLen)。
  4. separator 爲宿主環境的當前語言環境對應的列表分隔符字符串(這是實現定義的方式得到的)。Note.png
  5. 如果 len 是零,返回空字符串。
  6. firstElement 爲以 "0" 作爲參數調用 array [[Get]] 內部方法的結果。
  7. 如果 firstElementundefinednull,則
    1. R 爲空字符串。V8.png
  8. 否則
    1. elementObj ToObject(firstElement).
    2. func 爲以 "toLocaleString" 作爲參數調用 elementObj [[Get]] 內部方法的結果。
    3. 如果 IsCallable(func) 是 false,拋出一個 TypeError 異常。
    4. R 爲提供 elementObj 作爲 this 值並以空參數列表調用 func [[Call]] 內部方法的結果。
  9. k1
  10. 只要 k < len 就重複
    1. S 爲串聯 Rseparator 產生的字符串。
    2. nextElement 爲以 ToString(k) 作爲參數調用 array [[Get]] 內部方法的結果。
    3. 如果 nextElementundefinednull,則
      1. R 爲空字符串。
    4. 否則
      1. elementObj ToObject(nextElement).
      2. func 爲以 "toLocaleString" 作爲參數調用 elementObj [[Get]] 內部方法的結果。
      3. 如果 IsCallable(func) 是 false,拋出一個 TypeError 異常。
      4. R 爲提供 elementObj 作爲 this 值並以空參數列表調用 func [[Call]] 內部方法的結果。
    5. R 爲串聯 SR 產生的字符串。
    6. k 遞增 1
  11. 返回 R
注:此函數的第一個參數可能會在本標準的未來版本中用到;建議實現不要以任何其他用途使用這個參數位置。
注:toLocaleString 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 toLocaleString 函數是依賴於實現的。

Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )

當以零個或更多個參數 item1item2,等,調用 concat 方法時,會返回一個數組。 返回的數組包含 調用對象的數組元素Note.png 和隨後順序每個參數的數組元素Note.png

採用如下步驟:V8.png V8.png

  1. O 爲以 this 值作爲參數調用 ToObject 的結果。V8.png
  2. A 爲彷彿是用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
  3. n0
  4. items 爲一個內部列表,他的第一個元素是 O,之後的元素是調用時傳給這個函數的各參數(以從左到右的順序)。
  5. 只要 items 不是空就重複
    1. 刪除 items 的第一個元素,並令 E 爲這個元素值。V8.png
    2. 如果 E [[Class]] 內部屬性是 "Array",則
      1. k0
      2. len 爲以 "length" 爲參數調用 E [[Get]] 內部方法的結果。
      3. 只要 k < len 就重複
        1. P ToString(k).
        2. exists 爲以 P 作爲參數調用 E [[HasProperty]] 內部方法的結果。
        3. 如果 existstrue,則
          1. subElement 爲以 P 作爲參數調用 E [[Get]] 內部方法的結果。
          2. ToString(n)、屬性描述符 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
        4. n 遞增 1
        5. k 遞增 1
    3. 否則,E 不是數組
      1. ToString(n)、屬性描述符 { [[Value]]: E, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
      2. n 遞增 1
  6. 返回 A

concat 方法的 length 屬性是 1

注:concat 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 concat 函數是依賴於實現的。


Array.prototype.join (separator)

數組元素先被轉換爲字符串,再將這些字符串用 separator 分割連接在一起。如果沒提供分隔符,將一個逗號用作分隔符。

join 方法需要一個參數 separator,執行以下步驟 :V8.png

  1. O 爲以 this 值作爲參數調用 ToObject 的結果。
  2. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。
  3. len ToUint32(lenVal)。V8.png
  4. 如果 separatorundefined,令 separator 爲單字符字符串 ","V8.png
  5. sep ToString(separator)。
  6. 如果 len 是零,返回空字符串。V8.png
  7. element0 爲以 "0" 作爲參數調用 O [[Get]] 內部方法的結果。
  8. 如果 element0undefinednull, 令 R 爲空字符串;否則,令 R ToString(element0)。
  9. k1.
  10. 只要 k < len 就重複
    1. S 爲串聯 Rsep 產生的字符串值。 V8.png
    2. element 爲以 ToString(k) 作爲參數調用 O [[Get]] 內部方法的結果。
    3. 如果 elementundefinednull,令 next 爲空字符串;否則,令 next ToString(element)。
    4. R 爲串聯 Snext 產生的字符串值。
    5. k 遞增 1
  11. 返回 R

join 方法的 length 屬性是 1

注: join 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 join 函數是依賴於實現的。


Array.prototype.pop ( )

刪除並返回數組的最後一個元素。

  1. O 爲以 this 值作爲參數調用 ToObject 的結果V8.png
  2. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。
  3. len ToUint32(lenVal)。
  4. 如果 len 是零
    1. "length"0trueV8.pngMoz.png 作爲參數調用 O [[Put]] 內部方法。Note.png
    2. 返回 undefinedV8.png
  5. 否則,len > 0
    1. indx ToString(len - 1)。
    2. element 爲以 indx 作爲參數調用 O [[Get]] 內部方法的結果。
    3. indxtrue 作爲參數調用 O [[Delete]] 內部方法。V8.png
    4. "length"indxtrue 作爲參數調用 O [[Put]] 內部方法Bug.png
    5. 返回 element
注: pop 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 pop 函數是依賴於實現的。


Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )

將參數以他們出現的順序追加到數組末尾。數組的新 length 屬性值會作爲調用的結果返回。

當以零或更多個參數 item1item2,等,調用 push 方法,採用以下步驟:V8.png

  1. O 爲以 this 值作爲參數調用 ToString 的結果。
  2. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. n ToUint32(lenVal)。
  4. items 爲一個內部列表,它的元素是調用這個函數時傳入的參數(從左到右的順序)。
  5. 只要 items 不是空就重複
    1. 刪除 items 的第一個元素,並令 E 爲這個元素的值。
    2. ToString(n)、Etrue 作爲參數調用 O [[Put]] 內部方法。V8.png
    3. n 遞增 1
  6. "length"ntrue 作爲參數調用 O [[Put]] 內部方法。
  7. 返回 nV8.png

push 方法的 length 屬性是 1

注: push 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 push 函數是依賴於實現的。


Array.prototype.reverse ( )

重新排列數組元素,以翻轉它們的順序。對象會被當做調用的結果返回。V8.png

  1. O 爲以 this 值作爲參數調用 ToObject 的結果。
  2. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。
  3. len ToUint32(lenVal)。V8.png
  4. middle floor(len / 2)。
  5. lower0
  6. 只要 lowermiddle 就重複
    1. upperlen - lower - 1
    2. upperP ToString(upper)。
    3. lowerP ToString(lower)。
    4. lowerValue 爲以 lowerP 作爲參數調用 O [[Get]] 內部方法的結果。
    5. upperValue 爲以 upperP 作爲參數調用 O [[Get]] 內部方法的結果。
    6. lowerExists 爲以 lowerP 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    7. upperExists 爲以 upperP 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    8. 如果 lowerExiststrue 並且 upperExiststrue,則
      1. lowerPupperValuetrue 作爲參數調用 O [[Put]] 內部方法。
      2. upperPlowerValuetrue 作爲參數調用 O [[Put]] 內部方法。
    9. 否則如果 lowerExistsfalse 並且 upperExiststrue,則
      1. lowerPupperValuetrue 作爲參數調用 O [[Put]] 內部方法。
      2. upperPtrue 作爲參數調用 O [[Delete]] 內部方法。V8.png
    10. 否則如果 lowerExiststrue 並且 upperExistsfalse,則
      1. lowerPtrue 作爲參數調用 O [[Delete]] 內部方法。 V8.png
      2. upperPlowerValuetrue 作爲參數調用 O [[Put]] 內部方法。
    11. 否則,lowerExistsupperExists 都是 false
      1. 不需要做任何事情。
    12. lower 遞增 1
  7. 返回 O
注: reverse 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 reverse 函數是依賴於實現的。


Array.prototype.shift ( )

刪除並返回數組的第一個元素。V8.png V8.png

  1. O 爲以 this 值作爲參數調用 ToObject 的結果。
  2. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。
  3. len ToUint32(lenVal)。
  4. 如果 len 是零 , 則
    1. "length"0true 作爲參數調用 O [[Put]] 內部方法。
    2. 返回 undefinedV8.png
  5. first 爲以 "0" 作爲參數調用 O [[Get]] 內部方法的結果。
  6. k1
  7. 只要 k < len 就重複
    1. from ToString(k)。
    2. to ToString(k - 1)。
    3. fromPresent 爲以 from 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    4. 如果 fromPresenttrue, 則
      1. fromVal 爲以 from 作爲參數調用 O [[Get]] 內部方法的結果。
      2. tofromValtrue 作爲參數調用 O [[Put]] 內部方法。
    5. 否則,fromPresentfalse
      1. toture 作爲參數調用 O [[Delete]] 內部方法。
    6. k 遞增 1
  8. ToString(len - 1) 和 true 作爲參數調用 O [[Delete]] 內部方法。
  9. "length"、(len - 1) 和 true 作爲參數調用 O [[Put]] 內部方法。V8.png
  10. 返回 first
注: shift 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 shift 函數是依賴於實現的。


Array.prototype.slice (start, end)

slice 方法需要 startend 兩個參數,返回一個數組,這個數組包含從下標爲 start 的元素到下標爲 end(不含 end)的元素(或如果 endundefined 就到數組末尾)。如果 start 爲負,它會被當做是 length + start,這裏的 length 是數組長度。如果 end 爲負,它會被當做是 length + end,這裏的 length 是數組長度。採用如下步驟:V8.png

  1. O 爲以 this 值作爲參數調用 ToObject 的結果。
  2. A 爲彷彿用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
  3. lenVal 爲以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  4. len ToUint32(lenVal)。
  5. relativeStart ToInteger(start)。
  6. 如果 relativeStart 爲負,令 k max((len + relativeStart), 0);否則令 k min(relativeStart, len)。
  7. 如果 endundefined,令 relativeEnd len;否則令 relativeEnd ToInteger(end)。
  8. 如果 relativeEnd 爲負,令 final max((len + relativeEnd), 0);否則令 final min(relativeEnd, len)。
  9. n0
  10. 只要 k < final 就重複
    1. Pk ToString(k)。
    2. kPresentPk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue, 則
      1. kValue 爲以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. ToString(n)、屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
    4. k 遞增 1
    5. n 遞增 1
  11. 返回 A

slice 方法的 length 屬性是 2

注: slice 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 slice 函數是依賴於實現的。


Array.prototype.sort (comparefn)

this 數組的元素排序。排序不一定是穩定的(相等的元素們不一定按照他們原來的順序排列)。如果 comparefn 不是 undefined,它就必須是個函數,這個函數接受兩個參數 xy,如果 x < y 返回一個負值,如果 x = y 返回零,如果 x > y 返回一個正值。Question.png

obj 爲以 this 值作爲參數調用 ToObject 的結果。

"length" 作爲參數調用 obj [[Get]] 內部方法,將結果作爲參數調用 Uint32Question.png,令 len 爲返回的結果。V8.png

如果 comparefn 不是 undefined 並且不是對 this 數組的元素保持一致的比較函數(見下面),那麼這種情況下 sort 的行爲是由實現來定義的。

protoobj [[Prototype]] 內部屬性。如果 proto 不是 null 並且存在一個整數 j 滿足下面列出的全部條件,那麼這種情況下 sort 的行爲是實現定義的:

如果 obj 是稀疏的並且以下任何條件爲真,那麼這種情況下 sort 的行爲也是實現定義的:

  • obj [[Extensible]] 內部屬性是 false
  • 任何名爲小於 len 的非負整數的數組索引屬性中,有 [[Configurable]] 特性是 false 的數據屬性。

任何名爲小於 len 的非負整數的數組索引屬性中,有訪問器屬性,或有 [[Writable]] 特性是 false 的數據屬性,那麼這種情況下 sort 的行爲也是實現定義的。

否則,採用如下步驟。Note.png

  1. 根據實現定義的排序算法,通過調用若干次 obj [[Get]][[Put]][[Delete]] 內部方法和 SortCompare 的有機組合來完成排序。這裏對每個 [[Get]][[Put]] [[Delete]] 調用的第一個參數是小於 len 的非負整數,SortCompare 調用的參數是前面調用 [[Get]] 內部方法的結果。調用 [[Put]] [[Delete]] 內部方法時,throw 參數是 true。如果 obj 不是稀疏的,則必須不調用 [[Delete]]
  2. 返回 obj

返回的對象必須擁有下面兩個性質。Note.png

  • 必須有這樣的數學排列 π,它是由比 len 小的非負整數組成,對於每個比 len 小的非負整數 j,如果屬性 old[j] 存在 , 則 new[π(j)] 有與 old[j] 相同的值,如果屬性 old[j] 不存在,則 new[π(j)] 也不存在。
  • 對於都比 len 小的所有非負整數 jk,如果 SortCompare(j, k) < 0, 則 π(j) < π(k).

這裏的符號 old[j] 用來指:假定在執行這個函數之前以 j 作爲參數調用 obj [[Get]] 內部方法的結果,符號 new[j] 用來指:假定在執行這個函數後以 j 作爲參數調用 obj [[Get]] 內部方法的結果。

如果對於集合 S 裏的任何值 abc(可以是相同值),都滿足以下所有條件,那麼函數 comparefn 是在集合 S 上保持一致的比較函數(以下,符號 a <CF b 表示 comparefn(a, b) < 0;符號 a =CF b 表示 comparefn(a, b) = 0不論正負); 符號 a >CF b 表示 comparefn(a, b) > 0):

  • 當用指定值 ab 作爲兩個參數調用 comparefn(a, b),總是返回相同值 v。此外 Type(v) 是 Number, 並且 v 不是 NaN。注意,這意味着對於給定的 aba <CF ba =CF ba >CF b 中正好有一個爲真。
  • 調用 comparefn(a, b) 不改變 this 對象。
  • a =CF a(自反性)
  • 如果 a =CF b, 則 b =CF a(對稱性)
  • 如果 a =CF b 並且 b =CF c,則 a =CF c=CF 傳遞)
  • 如果 a <CF b 並且 b <CF c, 則 a <CF c<CF 傳遞)
  • 如果 a >CF b 並且 b >CF c,則 a >CF c>CF 傳遞)
注: 這些條件是確保 comparefn 劃分集合 S 爲等價類並且是完全排序等價類的充分必要條件。

當用兩個參數 jk 調用抽象操作 SortCompare,採用如下步驟:Question.png

  1. jString ToString(j)。
  2. kString ToString(k)。
  3. hasj 爲 以 jString 作爲參數調用 obj [[HasProperty]] 內部方法的結果。
  4. hask 爲 以 kString 作爲參數調用 obj [[HasProperty]] 內部方法的結果。
  5. 如果 hasjhask 都是 false,則返回 +0
  6. 如果 hasjfalse,則返回 1
  7. 如果 haskfalse,則返回 -1
  8. x 爲 以 jString 作爲參數調用 obj [[Get]] 內部方法的結果。
  9. y 爲 以 kString 作爲參數調用 obj [[Get]] 內部方法的結果。
  10. 如果 xy 都是 undefined,返回 +0
  11. 如果 xundefined,返回 1
  12. 如果 yundefined,返回 −1
  13. 如果 參數 comparefn 不是 undefined, 則
    1. 如果 IsCallable(comparefn) 是 false,拋出一個 TypeError 異常。
    2. 傳入 undefined 作爲 this 值,以 x y 作爲參數調用 comparefn [[Call]] 內部方法,返回結果。
  14. xString ToString(x)。
  15. yString ToString(y)。
  16. 如果 xString < yString,返回 −1
  17. 如果 xString > yString,返回 1
  18. 返回 +0
注: 因爲不存在的屬性值總是比 undefined 屬性值大,並且 undefined 屬性值總是比任何其他值大,所以 undefined 屬性值總是排在結果的末尾,後面跟着不存在的屬性值。
注: sort 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 sort 函數是依賴於實現的。


Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )

當以兩個或更多參數 startdeleteCount 和(可選的)item1item2, 等,調用 splice 方法,從數組索引 start 開始的 deleteCount 個數組元素會被替換爲參數 item1item2, 等。返回一個包含參數元素(如果有)的數組。採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. A 爲 彷彿用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
  3. lenVal 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  4. len ToUint32(lenVal)。
  5. relativeStart ToInteger(start)。
  6. 如果 relativeStart 爲負,令 actualStart max((len + relativeStart),0); 否則令 actualStart min(relativeStart, len)。
  7. actualDeleteCount min(max(ToInteger(deleteCount),0),len - actualStart)。
  8. k0
  9. 只要 k < actualDeleteCount 就重複 Note.png
    1. from ToString(actualStart + k)。
    2. fromPresent 爲 以 from 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 fromPresenttrue,則
      1. fromValue 爲 以 from 作爲參數調用 O [[Get]] 內部方法的結果。
      2. ToString(k), 屬性描述符 {[[Value]]: fromValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
    4. k 遞增 1.
  10. items 爲一個內部列表,它的元素是實際參數列表中 item1 開始的參數(從左到右的順序)。如果沒傳入這些項目,則列表是空的。
  11. itemCountitems 的元素個數。
  12. 如果 itemCount < actualDeleteCount,則 Note.png
    1. kactualStart
    2. 只要 k < (len - actualDeleteCount) 就重複
      1. from ToString(k + actualDeleteCount)。
      2. to ToString(k + itemCount)。
      3. fromPresent 爲 以 from 作爲參數調用 O [[HasProperty]] 內部方法的結果。
      4. 如果 fromPresenttrue,則
        1. fromValue 爲 以 from 作爲參數調用 O [[Get]] 內部方法的結果。
        2. tofromValuetrue 作爲參數調用 O [[Put]] 內部方法。
      5. 否則,fromPresentfalse
        1. totrue 作爲參數調用 O [[Delete]] 內部方法。
      6. k 遞增 1
    3. klen
    4. 只要 k > (len - actualDeleteCount + itemCount) 就重複
      1. ToString(k - 1) 和 true 作爲參數調用 O [[Delete]] 內部方法。
      2. k 遞減 1.
  13. 否則如果 itemCount > actualDeleteCount,則 Note.png
    1. k 爲 (len - actualDeleteCount)。
    2. 只要 k > actualStart 就重複
      1. from ToString(k + actualDeleteCount - 1)。
      2. to ToString(k + itemCount - 1)
      3. fromPresent 爲 以 from 作爲參數調用 O [[HasProperty]] 內部方法的結果。
      4. 如果 fromPresenttrue, 則
        1. fromValue 爲 以 from 作爲參數調用 O [[Get]] 內部方法的結果。
        2. tofromValuetrue 作爲參數調用 O [[Put]] 內部方法。
      5. 否則,fromPresentfalse
        1. totrue 作爲參數調用 O [[Delete]] 內部方法。
      6. k 遞減 1
  14. kactualStart
  15. 只要 items 不是空 就重複 Note.png
    1. 刪除 items 的第一個元素,並令 E 爲這個元素值。
    2. ToString(k)、Etrue 作爲參數調用 O [[Put]] 內部方法。
    3. k 遞增 1
  16. "length"、(len - actualDeleteCount + itemCount) 和 true 作爲參數調用 O [[Put]] 內部方法。
  17. 返回 A

splice 方法的 length 屬性是 2

注: splice 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 splice 函數是依賴於實現的。


Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )

將參數們插入到數組的開始位置,它們在數組中的順序與它們出現在參數列表中的順序相同。

當以零或更多個參數 item1item2,等,調用 unshift 方法,採用如下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenVal 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenVal)。
  4. argCount 爲 實際參數的個數。
  5. klen
  6. 只要 k > 0,就重複 Note.png
    1. from ToString(k - 1)。
    2. to ToString(k + argCount - 1)。
    3. fromPresent 爲 以 from 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    4. 如果 fromPresenttrue,則
      1. fromValue 爲 以 from 作爲參數調用 O [[Get]] 內部方法的結果。
      2. tofromValuetrue 作爲參數調用 O [[Put]] 內部方法。
    5. 否則,fromPresentfalse
      1. totrue 作爲參數調用 O [[Delete]] 內部方法。
    6. k 遞減 1
  7. j0
  8. items 爲一個內部列表,它的元素是調用這個函數時傳入的實際參數(從左到右的順序)。
  9. 只要 items 不是空,就重複 Note.png
    1. 刪除 items 的第一個元素,並令 E 爲這個元素值 .
    2. ToString(j)、Etrue 作爲參數調用 O [[Put]] 內部方法。
    3. j 遞增 1
  10. "length"len + argCounttrue 作爲參數調用 O [[Put]] 內部方法。
  11. 返回 len + argCount

unshift 方法的 length 屬性是 1

注: unshift 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 unshift 函數是依賴於實現的。


Array.prototype.indexOf ( searchElement [ , fromIndex ] )

indexOf 按照索引的升序比較 searchElement 和數組裏的元素們,它使用內部的嚴格相等比較算法(11.9.6),如果找到一個或更多這樣的位置,返回這些位置中第一個索引;否則返回 -1V8.png

可選的第二個參數 fromIndex 默認是 0(即搜索整個數組)。如果它大於或等於數組長度,返回 -1,即不會搜索數組。如果它是負的,就把它當作從數組末尾到計算後的 fromIndex 的偏移量。如果計算後的索引小於 0,就搜索整個數組。 Note.png

當用一個或兩個參數調用 indexOf 方法,採用以下步驟:

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 len0,返回 -1
  5. 如果 傳入了參數 fromIndex,則令 n ToInteger(fromIndex);否則令 n0
  6. 如果 nlen,返回 -1
  7. 如果 n0,則
    1. kn
  8. 否則,n < 0
    1. klen - abs(n)。 Question.png
    2. 如果 k 小於 0,則令 k0
  9. 只要 k < len,就重複
    1. kPresent 爲 以 ToString(k) 爲參數調用 O [[HasProperty]] 內部方法的結果。
    2. 如果 kPresenttrue,則
      1. elementK 爲 以 ToString(k) 爲參數調用 O [[Get]] 內部方法的結果。
      2. same 爲 對 searchElementelementK 執行嚴格相等比較算法的結果。
      3. 如果 sametrue,返回 k
    3. k 遞增 1
  10. 返回 -1

indexOf 方法的 length 屬性是 1

注: indexOf 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 indexOf 函數是依賴於實現的。


Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

lastIndexOf 按照索引的降序比較 searchElement 和數組裏的元素們,它使用內部的嚴格相等比較算法 (11.9.6),如果找到一個或更多這樣的位置,返回這些位置中最後一個索引;否則返回 -1V8.png

可選的第二個參數 fromIndex 默認是數組的長度減一(即搜索整個數組)。如果它大於或等於數組長度,將會搜索整個數組。如果它是負的,就把它當作從數組末尾到計算後的 fromIndex 的偏移量。如果計算後的索引小於 0,返回 -1Note.png

當用一個或兩個參數調用 lastIndexOf 方法,採用如下步驟 :

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 len0,返回 -1
  5. 如果 傳入了參數 fromIndex,則令 n ToInteger(fromIndex); 否則令 nlen
  6. 如果 n0,則令 k min(n, len - 1)。
  7. 否則,n < 0
    1. klen - abs(n)。Question.png
  8. 只要 k0 就重複
    1. kPresent 爲 以 ToString(k) 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    2. 如果 kPresenttrue,則
      1. elementK 爲 以 ToString(k) 作爲參數調用 O [[Get]] 內部方法的結果。
      2. same 爲 對 searchElementelementK 執行嚴格相等比較算法的結果。
      3. 如果 sametrue,返回 k
    3. k 遞減 1
  9. 返回 -1

lastIndexOf 方法的 length 屬性是 1

注: lastIndexOf 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 lastIndexOf 函數是依賴於實現的。


Array.prototype.every ( callbackfn [ , thisArg ] )

callbackfn 應該是個函數,它接受三個參數並返回一個可轉換爲布爾值 true false 的值。every 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,直到他找到一個使 callbackfn 返回 false 的元素。如果找到這樣的元素,every 馬上返回 false,否則如果對所有元素 callbackfn 都返回 trueevery 將返回 truecallbackfn 只被數組裏實際存在的元素調用;它不會被缺少的元素調用。

如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。

every 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

every 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 every 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,every 訪問這些元素時的值會傳給 callbackfn;在 every 調用開始後刪除的和之前被訪問過的元素們是不訪問的。every 的行爲就像數學量詞“所有(for all)”。特別的,對一個空數組,它返回 true

當以一個或兩個參數調用 every 方法,採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
  5. 如果提供了 thisArg,令 TthisArg;否則令 Tundefined
  6. k0
  7. 只要 k < len,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果 .
      2. testResult 爲 以 T 作爲 this 值以包含 kValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
      3. 如果 ToBoolean(testResult) 是 false,返回 false
    4. k 遞增 1
  8. 返回 true

every 方法的 length 屬性是 1

注: every 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 every 函數是依賴於實現的。


Array.prototype.some ( callbackfn [ , thisArg ] )

callbackfn 應該是個函數,它接受三個參數並返回一個可轉換爲布爾值 true false 的值。some 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,直到他找到一個使 callbackfn 返回 true 的元素。如果找到這樣的元素,some 馬上返回 true,否則,some 返回 falsecallbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。

如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。

some 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

some 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 some 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,some 訪問這些元素時的值會傳給 callbackfn;在 some 調用開始後刪除的和之前被訪問過的元素們是不訪問的。some 的行爲就像數學量詞“存在(exists)”。特別的,對一個空數組,它返回 false

當以一個或兩個參數調用 some 方法,採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false, 拋出一個 TypeError 異常。V8.png
  5. 如果提供了 thisArg,令 TthisArg;否則令 Tundefined
  6. k0
  7. 只要 k < len,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. testResult 爲 以 T 作爲 this 值以包含 kValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
      3. 如果 ToBoolean(testResult) 是 true,返回 true
    4. k 遞增 1
  8. 返回 false

some 方法的 length 屬性是 1

注: some 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 some 函數是依賴於實現的。


Array.prototype.forEach ( callbackfn [ , thisArg ] )


callbackfn 應該是個函數,它接受三個參數。forEach 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfncallbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。

如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。

forEach 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

forEach 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 forEach 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,forEach 訪問這些元素時的值會傳給 callbackfn;在 forEach 調用開始後刪除的和之前被訪問過的元素們是不訪問的。

當以一個或兩個參數調用 forEach 方法,採用以下步驟:V8.png


  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。V8.png
  5. 如果提供了 thisArg,令 TthisArg;否則令 Tundefined
  6. k0
  7. 只要 k < len,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. T 作爲 this 值以包含 kValuekO 的參數列表調用 callbackfn 的 [[Call]] 內部方法。
    4. k 遞增 1
  8. 返回 undefined

forEach 方法的 length 屬性是 1

注:forEach 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 forEach 函數是依賴於實現的。


Array.prototype.map ( callbackfn [ , thisArg ] )

callbackfn 應該是個函數,它接受三個參數。map 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,並用結果構造一個新數組。callbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。 V8.png

如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。

map 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

map 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 map 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,map 訪問這些元素時的值會傳給 callbackfn;在 map 調用開始後刪除的和之前被訪問過的元素們是不訪問的。

當以一個或兩個參數調用 map 方法,採用以下步驟:

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。V8.png
  5. 如果提供了 thisArg,令 TthisArg;否則令 Tundefined
  6. A 爲 彷彿用 new Array(len) Note.png 創建的新數組,這裏的 Array 是標準內置構造器名,lenlen 的值。
  7. k0
  8. 只要 k < len,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. mappedValue 爲 以 T 作爲 this 值以包含 kValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
      3. Pk,屬性描述符 {[[Value]]: mappedValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
    4. k 遞增 1
  9. 返回 A

map 方法的 length 屬性是 1

注:map 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 map 函數是依賴於實現的。


Array.prototype.filter ( callbackfn [ , thisArg ] )


callbackfn 應該是個函數,它接受三個參數並返回一個可轉換爲布爾值 true false 的值。filter 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,並用使 callbackfn 返回 true 的所有值構造一個新數組。callbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。

如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。

filter 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

filter 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 filter 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,filter 訪問這些元素時的值會傳給 callbackfn;在 filter 調用開始後刪除的和之前被訪問過的元素們是不訪問的。

當以一個或兩個參數調用 filter 方法,採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false, 拋出一個 TypeError 異常。V8.png
  5. 如果提供了 thisArg,令 TthisArg;否則令 T 爲 undefined
  6. A 爲 彷彿用 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
  7. k0
  8. to0
  9. 只要 k < len,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. selected 爲 以 T 作爲 this 值以包含 kValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
      3. 如果 ToBoolean(selected) 是 true,則
        1. ToString(to),屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
        2. to 遞增 1
    4. k 遞增 1
  10. 返回 A

filter 方法的 length 屬性是 1

注:filter 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 filter 函數是依賴於實現的。


Array.prototype.reduce ( callbackfn [ , initialValue ] )

callbackfn 應該是個函數,它需要四個參數。reduce 按照索引的升序,對數組裏存在的每個元素,將 callbackfn 作爲回調函數調用一次。

調用 callbackfn 時將傳入四個參數:previousValueinitialValue 的值或上次調用 callbackfn 的返回值)、currentValue(當前元素值)、currentIndex遍歷的對象。第一次調用回調函數時,previousValuecurrentValue 的取值可以是下面兩種情況之一。如果爲 reduce 調用提供了一個 initialValue,則 previousValue 將等於 initialValue 並且 currentValue 將等於數組的首個元素值。如果沒提供 initialValue,則 previousValue 將等於數組的首個元素值並且 currentValue 將等於數組的第二個元素值。如果數組裏沒有元素並且沒有提供 initialValue,則拋出一個 TypeError 異常。

reduce 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

reduce 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 reduce 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,reduce 訪問這些元素時的值會傳給 callbackfn;在 reduce 調用開始後刪除的和之前被訪問過的元素們是不訪問的。

當以一個或兩個參數調用 reduce 方法,採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
  5. 如果 len0 並且 initialValue 不是 present,拋出一個 TypeError 異常。V8.png
  6. k0
  7. 如果 initialValue 參數有傳入值,則
    1. 設定 accumulatorinitialValue
  8. 否則,initialValue 參數沒有傳入值 Note.png
    1. kPresentfalse
    2. 只要 kPresentfalse 並且 k < len,就重複
      1. Pk ToString(k)。
      2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
      3. 如果 kPresenttrue,則
        1. accumulator 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      4. k 遞增 1.
    3. 如果 kPresentfalse,拋出一個 TypeError 異常。
  9. 只要 k < len,重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. accumulator 爲 以 undefined 作爲 this 值並以包含 accumulatorkValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
    4. k 遞增 1
  10. 返回 accumulator

reduce 方法的 length 屬性是 1

注:reduce 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 reduce 函數是依賴於實現的。


Array.prototype.reduceRight ( callbackfn [ , initialValue ] )

callbackfn 應該是個函數,它需要四個參數。reduceRight 按照索引的升序,對數組裏存在的每個元素 , 將 callbackfn 作爲回調函數調用一次。

調用 callbackfn 時將傳入四個參數:previousValueinitialValue 的值或上次調用 callbackfn 的返回值),currentValue(當前元素值),currentIndex遍歷的對象。第一次調用回調函數時,previousValuecurrentValue 的取值可以是下面兩種情況之一。如果爲 reduceRight 調用提供了一個 initialValue,則 previousValue 將等於 initialValue 並且 currentValue 將等於數組的最後一個元素值。如果沒提供 initialValue,則 previousValue 將等於數組的最後一個元素值並且 currentValue 將等於數組的倒數第二個元素值。如果數組裏沒有元素並且沒有提供 initialValue,則拋出一個 TypeError 異常。

reduceRight 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。

reduceRight 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 reduceRight 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,reduceRight 訪問這些元素時的值會傳給 callbackfn;在 reduceRight 調用開始後刪除的和之前被訪問過的元素們是不訪問的。

當以一個或兩個參數調用 reduceRight 方法,採用以下步驟:V8.png

  1. O 爲 以 this 值作爲參數調用 ToObject 的結果。
  2. lenValue 爲 以 "length" 作爲參數調用 O [[Get]] 內部方法的結果。V8.png
  3. len ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
  5. 如果 len0 並且 initialValue 不是 present,拋出一個 TypeError 異常。
  6. k0
  7. 如果 initialValue 參數有傳入值,則
    1. 設定 accumulatorinitialValue
  8. 否則,initialValue 參數沒有傳入值 Note.png
    1. kPresentfalse
    2. 只要 kPresentfalse 並且 k0,就重複
      1. Pk ToString(k)。
      2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
      3. 如果 kPresenttrue,則
        1. accumulator 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      4. k 遞減 1
    3. 如果 kPresentfalse,拋出一個 TypeError 異常。
  9. 只要 k0,就重複
    1. Pk ToString(k)。
    2. kPresent 爲 以 Pk 作爲參數調用 O [[HasProperty]] 內部方法的結果。
    3. 如果 kPresenttrue,則
      1. kValue 爲 以 Pk 作爲參數調用 O [[Get]] 內部方法的結果。
      2. accumulator 爲 以 undefined 作爲 this 值並以包含 accumulatorkValuekO 的參數列表調用 callbackfn [[Call]] 內部方法的結果。
    4. k 遞減 1.
  10. 返回 accumulator

reduceRight 方法的 length 屬性是 1

注:reduceRight 函數被有意設計成通用的;它的 this 值並非必須是數組對象。因此,它可以作爲方法轉移到其他類型的對象中。一個宿主對象是否可以正確應用這個 reduceRight 函數是依賴於實現的。


Array 實例的屬性

Array 實例從數組原型對象繼承屬性,Array 實例的 [[Class]] 內部屬性是 "Array"Array 實例還有以下屬性。


[[DefineOwnProperty]] ( P, Desc, Throw )

數組對象使用一個,用在其他原生 ECMAscript 對象的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的變化版。

A 爲一個數組對象,Desc 爲一個屬性描述符,Throw 爲一個布爾標示。

在以下算法中,術語“拒絕”指代“如果 Throwtrue,則拋出 TypeError 異常,否則返回 false

當用屬性名 P、屬性描述 Desc、布爾值 Throw 調用 A[[DefineOwnProperty]] 內部方法,採用以下步驟:

  1. oldLenDesc 爲 以 "length" 作爲參數調用 A [[GetOwnProperty]] 內部方法的結果。 結果絕不會是 undefined 或一個訪問器描述符,因爲在創建數組時的 length 是一個不可刪除或重新配置的數據屬性。
  2. oldLenoldLenDesc.[[Value]]
  3. 如果 P"length", 則
    1. 如果 Desc [[Value]] 字段不存在 , 則
      1. "length"Desc、和 Throw 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。
    2. newLenDescDesc 的一個拷貝。
    3. newLen ToUint32(Desc.[[Value]])。
    4. 如果 newLen 不等於 ToNumber(Desc.[[Value]]),拋出一個 RangeError 異常。
    5. 設定 newLenDesc.[[Value]]newLen
    6. 如果 newLenoldLen,則
      1. "length"newLenDescThrow 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。
    7. 如果 oldLenDesc.[[Writable]]false拒絕
    8. 如果 newLenDesc.[[Writable]] 不存在或值是 true,令 newWritabletrue
    9. 否則,
      1. 因爲它將使得無法刪除任何元素,所以需要延後設定 [[Writable]] 特性爲 false
      2. newWritablefalse
      3. 設定 newLenDesc.[[Writable]]true
    10. succeeded 爲 以 "length"newLenDesc Throw 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的結果
    11. 如果 succeededfalse,返回 false
    12. 只要 newLen < oldLen,就重複,
      1. 設定 oldLenoldLen1
      2. deleteSucceeded 爲 以 ToString(oldLen) 和 false 作爲參數調用 A [[Delete]] 內部方法的結果。
      3. 如果 deleteSucceededfalse,則
        1. 設定 newLenDesc.[[Value]]oldLen + 1
        2. 如果 newWritablefalse,設定 newLenDesc.[[Writable]]false
        3. "length"newLenDescfalse 爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法。
        4. 拒絕V8.png
    13. 如果 newWritablefalse,則
      1. "length",屬性描述符 {[[Writable]]: false} 和 false 作爲參數在 A 上調用 [[DefineOwnProperty]] 內部方法。這個調用始終返回 true
    14. 返回 true
  4. 否則如果 P 是一個數組索引 (15.4),則
    1. index ToUint32(P)。
    2. 如果 indexoldLen 並且 oldLenDesc.[[Writable]]false拒絕
    3. succeeded 爲 以 PDescfalse 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的結果。
    4. 如果 succeededfalse拒絕
    5. 如果 indexoldLen
      1. 設定 oldLenDesc.[[Value]]index + 1
      2. 以 "length"oldLenDescfalse 作爲參數在在 A 上調用默認的 [[DefineOwnProperty]] 內部方法。這個調用始終返回 true
    6. 返回 true
  5. PDescThrow 作爲參數在在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。


length

數組對象的 length 屬性是個數據屬性,其值總是在數值上大於任何屬性名是數組索引的可刪除屬性的屬性名。

length 屬性擁有的初始特性是 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

注: 試圖將數組的 length 屬性設置爲一個值時,如果這個值小於或等於數組中最大不可刪除的數字屬性,那麼 length 將會被設置爲比那個屬性大一的數字。見 15.4.5.1。


String 對象


作爲函數調用 String 構造器

當將 String 作爲函數調用,而不是作爲構造器,它執行一個類型轉換。


String ( [ value ] )

返回一個由 ToString(value) 計算出的字符串值(不是 String 對象)。如果沒有提供 value,返回空字符串 ""。


String 構造器

String 作爲一個 new 表達式的一部分被調用,它是個構造器:它初始化新創建的對象。


new String ( [ value ] )

新構造對象的 [[Prototype]] 內部屬性設定爲標準內置的字符串原型對象,它是 String.prototype 的初始值 (15.5.3.1)。

新構造對象的 [[Class]] 內部屬性設定爲 "String"

新構造對象的 [[Extensible]] 內部屬性設定爲 true

新構造對象的 [[PrimitiveValue]] 內部屬性設定爲 ToString(value),或如果沒提供 value 則設定爲空字符串。


String 構造器的屬性

String 構造器的 [[Prototype]] 內部屬性的值是標準的內置 Function 原型對象

除了內部屬性和 length 屬性(值爲 1)之外,String 構造器還有以下屬性:


String.prototype

String.prototype 的初始值是標準的內置 String 原型對象V8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


String.fromCharCode ( [ char0 [ , char1 [ , … ] ] ] )

返回一個字符串值,包含的字符數與參數數目相同。每個參數指定返回字符串中的一個字符,也就是說第一個參數第一個字符,以此類推(從左到右)。一個參數轉換爲一個字符,通過先應用 ToUint16 操作,再將返回的16位整數看作字符的代碼單元值。如果沒提供參數,返回空字符串。V8.png

fromCharCode 函數的 length 屬性是 1


字符串原型對象的屬性

字符串原型對象本身是一個值爲空字符串的 String 對象(它的 [[Class]]"String")。

字符串原型對象的 [[Prototype]] 內部屬性值是標準的內置 Object 原型對象


String.prototype.constructor

String.prototype.constructor 的初始值是內置 String 構造器。V8.png


String.prototype.toString ( )

返回 this 字符串值。(注,對於一個 String 對象,toString 方法和 valueOf 方法返回相同值。)

toString 函數是非通用的;如果它的 this 值不是一個字符串或字符串對象,則拋出一個 TypeError 異常。因此它不能作爲方法轉移到其他類型對象上。V8.png


String.prototype.valueOf ( )

返回 this 字符串值。

valueOf 函數是非通用的;如果它的 this 值不是一個字符串或字符串對象,則拋出一個 TypeError 異常。因此它不能作爲方法轉移到其他類型對象上。V8.png


String.prototype.charAt (pos)

this 對象轉換爲一個字符串,返回包含了這個字符串 pos 位置的字符的字符串。如果那個位置沒有字符,返回空字符串。返回結果是個字符串值,不是字符串對象。

如果 pos 是一個數字類型的整數值,則 x.charAt(pos) 與 x.substring(pos, pos + 1) 的結果相等。

當用一個參數 pos 調用 charAt 方法,採用以下步驟:

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. position ToInteger(pos)。
  4. sizeS 的字符數。
  5. 如果 position < 0positionsize,返回空字符串。
  6. 返回一個長度爲 1 的字符串,它包含 Sposition 位置的一個字符,在這裏 S 中的第一個(最左邊)字符被當作是在位置 0,下一個字符被當作是在位置 1,等等。
注: charAt 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.charCodeAt (pos)

this 對象轉換爲一個字符串,返回一個代表這個字符串 pos 位置字符的代碼單元值的數字(小於 216 的非負整數)。如果那個位置沒有字符,返回 NaN

當用一個參數 pos 調用 charCodeAt 方法,採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. position ToInteger(pos)。V8.png
  4. sizeS 的字符數。
  5. 如果 position < 0positionsize,返回 NaN.
  6. 返回一個數字類型值,值是字符串 Sposition 位置字符的代碼單元值。 在這裏 S 中的第一個(最左邊)字符被當作是在位置 0,下一個字符被當作是在位置 1,等等。
注: charCodeAt 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.concat ( [ string1 [ , string2 [ , … ] ] ] )

當用一個或更多參數 string1string2,等,調用 concat 方法,它返回一個字符串,其中包含了轉換成字符串類型的 this 對象中的所有字符和後面跟着的每個參數(例如:string1string2,等)轉換成字符串類型后里面的所有字符。返回結果是一個字符串值,不是一個字符串對象。採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. args 爲一個內部列表,它是傳給這個函數的參數列表的拷貝。
  4. RS
  5. 只要 args 不是空,就重複
    1. 刪除 args 的第一個元素,並令 next 爲這個元素。
    2. R 爲一個包含了 R 中原有的所有字符跟上 ToString(next) 中的所有字符 的字符串值。
  6. 返回 R

concat 方法的 length 屬性是 1.

注: concat 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.indexOf (searchString, position)

this 對象轉換爲一個字符串,如果 searchString 在這個字符串裏大於或等於 position 的位置中的一個或多個位置使它呈現爲字符串的子串,那麼返回這些位置中最小的索引;否則返回 -1。如果 positionundefined,就認爲它是 0,以搜索整個字符串。

indexOf 需要兩個參數 searchStringposition,執行以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. 令 S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. searchStr ToString(searchString)。
  4. pos ToInteger(position)。(如果 positionundefined,此步驟產生 0)。
  5. lenS 的字符數。
  6. start min(max(pos, 0), len)。
  7. searchLenSearchStr 的字符數。
  8. 返回 一個不小於 start 的可能的最小值整數 k,使得 k + searchLen 不大於 len,並且對所有小於 searchLen 的非負數整數 jS k + j 位置字符和 searchStrj 位置字符相同;但如果沒有這樣的整數 k,則返回 -1Note.png

indexOflength 屬性是 1

注: indexOf 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.lastIndexOf (searchString, position)


this 對象轉換爲一個字符串,如果 searchString 在這個字符串裏小於或等於 position 的位置中的一個或多個位置使它呈現爲字符串的子串,那麼返回這些位置中最大的索引;否則返回 -1。如果 positionundefined Note.png,就認爲它是字符串值的長度,以搜索整個字符串。

lastIndexOf 需要兩個參數 searchStringposition,執行以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. searchStr ToString(searchString)。
  4. numPos ToNumber(position)。( 如果 positionundefined,此步驟產生 NaN)。
  5. 如果 numPosNaN,令 pos+∞;否則,令 pos ToInteger(numPos)。
  6. lenS 的字符數。
  7. start min(max(pos, 0), len)。
  8. searchLenSearchStr 的字符數。
  9. 返回 一個不大於 start 的可能的最大值整數 k,使得 k + searchLen 不大於 len,並且對所有小於 searchLen 的非負數整數 jS k + j 位置字符和 searchStrj 位置字符相同;但如果沒有這樣的整數 k,則返回 -1Note.png

lastIndexOflength 屬性是 1

注: lastIndexOf 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.localeCompare (that)

當以一個參數 that 來調用 localeCompare 方法,它返回一個非 NaN 數字值,這個數字值反應了對 this 值(轉換爲字符串)和 that 值(轉換爲字符串)進行語言環境敏感的字符串比較的結果。兩個字符串 SThat 用實現定義的一種方式進行比較。比較結果是按照系統默認語言環境指定的順序來排列字符串。根據這三種情況:SThat 前面、兩字符串相同、SThat 後面,分別返回:負數、零、正數。

在執行比較之前執行以下步驟以預備好字符串:

  1. this 值作爲參數調用 CheckObjectCoercible
  2. 令 S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. That ToString(that)。

如果將 localeCompare 方法看做是將 thisthat 作爲兩個參數的函數,那麼它是在所有字符串集合上的保持一致的比較函數(在 15.4.4.11 定義)。

實際返回值是實現定義的,允許實現者們在返回值裏編碼附加信息。但是函數需要定義一個在所有字符串上的總的順序。並且,當比較的字符串們被認爲是 Unicode 標準定義的標準等價,則返回 0

如果宿主環境沒有在所有字符串上語言敏感的比較,此函數可執行按位比較。

注: localeCompare 方法自身不適合直接作爲 Array.prototype.sort 的參數,因爲後者需要的是兩個參數的函數。
注: 這個函數的目的是在宿主環境中任何依靠語言敏感的比較方式都可用於 ECMAScript 環境,並根據宿主環境當前語言環境設置的規則進行比較。強烈建議這個函數把根據 Unicode 標準的標準等價的字符串當做是相同的(也就是說,要比較的字符串彷彿是都先被轉換爲正規化形式 C 或正規化形式 D 了)。還建議這個函數不履行 Unicode 相容等價或分解。
注: 本標準的未來版本可能會使用這個函數的第二個參數;建議實現不將這個參數位用作其他用途。
注: localeCompare 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.match (regexp)

當以 regexp 作爲參數調用 match 方法,採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. 如果 Type(regexp) 是 Object 並且 regexp [[Class]] 內部屬性的值是 "RegExp",則令 rxregexpV8.png
  4. 否則,令 rx 爲 彷彿是用表達式 new RegExp(regexp) 創建的新正則對象,這裏的 RegExp 是標準內置構造器名。V8.png
  5. global 爲 以 "global" 爲參數調用 rx [[Get]] 內部方法的結果。
  6. exec 爲 標準內置函數 RegExp.prototype.exec ( 見 15.10.6.2)
  7. 如果 global 不是 true,則
    1. rx 作爲 this 值,用包含 S 的參數列表調用 exec [[Call]] 內部方法,返回結果。
  8. 否則,globaltrue
    1. "lastIndex"0 作爲參數調用 rx [[Put]] 內部方法。
    2. A 爲 彷彿是用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
    3. previousLastIndex0
    4. n0
    5. lastMatchtrue
    6. 只要 lastMatchtrue,就重複
      1. result 爲 以 rx 作爲 this 值,用包含 S 的參數列表調用 exec [[Call]] 內部方法的結果。
      2. 如果 resultnull,則設定 lastMatch false
      3. 否則,result 不是 null
        1. thisIndex 爲 以 "lastIndex" 爲參數調用 rx [[Get]] 內部方法的結果。
        2. 如果 thisIndex = previousLastIndex Question.png
          1. "lastIndex"thisIndex + 1 爲參數調用 rx [[Put]] 內部方法。
          2. 設定 previousLastIndexthisIndex + 1
        3. 否則,設定 previousLastIndexthisIndex
        4. matchStr 爲 以 0 爲參數調用 result [[Get]] 內部方法的結果。
        5. ToString(n),屬性描述符 {[[Value]]: matchStr, [[Writable]]: true, [[Enumerable]]: true, [[configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
        6. n 遞增 1
    7. 如果 n = 0,則返回 null
    8. 返回 A
注: match 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.replace (searchValue, replaceValue)

首先根據以下步驟設定 string

  1. this 值作爲參數調用 CheckObjectCoercible
  2. string 爲 以 this 值作爲爲參數調用 ToString 的結果。

如果 searchValue 是一個正則表達式([[Class]] 內部屬性是 "RegExp" 的對象),按照如下執行:如果 searchValue.globalfalse,則搜索 string,找出匹配正則表達式 searchValue 的第一個子字符串。如果 searchValue.globaltrue,則搜索 string,找出匹配正則表達式 searchValue 的所有子字符串。搜索的做法與 String.prototype.match 相同,包括對 searchValue.lastIndex 的更新。令 msearchValue 的左捕獲括號的個數(使用 15.10.2.1 指定的 NcapturingParens)。V8.png

如果 searchValue 不是正則表達式,令 searchString ToString(searchValue),並搜索 string,找出第一個出現的 searchString 的子字符串。令 m0V8.png

如果 replaceValue 是函數,則對每個匹配的子字符串,以 m + 3 個參數調用這個函數。第一個參數是匹配的子字符串。如果 searchValue 是正則表達式,接下來 m 個參數是 MatchResult 裏的所有捕獲值。第 m + 2 個參數是發生的匹配在 string 裏的偏移量,第 m + 3 個參數是 string。結果是將輸入的原字符串裏的每個匹配子字符串替換爲相應函數調用的返回值(必要的情況下轉換爲字符串)得到的字符串。

否則,令 newstring 表示 replaceValue 轉換爲字符串的結果。結果是將輸入的原字符串裏的每個匹配子字符串替換爲 newstring 裏的字符根據表22指定的替代文本替換得到的字符串。替換這些 $ 是由左到右進行的,並且一旦執行了這樣的替換,新替換的文本不受進一步替換。例如 ,"$1,$2".replace(/(\$(\d))/g, "$$1-$1$2") 返回 "$1-$11,$1-$22"newstring 裏的一個 $ ,如果不符合以下任何格式,就保持原狀。

表22 替代文本符號替換
字符 替代文本
$$ $
$& 匹配到的子字符串
$` Note.png string 中匹配到的子字符串之前部分。
$' Note.png string 中匹配到的子字符串之後部分。
$n n 個捕獲結果,n 是範圍在 19 的單個數字,並且緊接着 $n 後面的不是十進制數字。如果 nm 且第 n 個捕獲結果是 undefined,就用空字符串代替。如果 n > m,結果是實現定義的。
$nn nn 個捕獲結果,nn 是範圍在 0199 的十進制兩位數。如果 nnm 且第 nn 個捕獲結果是 undefined,就用空字符串代替。如果 nn > m,結果是實現定義的。
注: replace 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.search (regexp)

當用參數 regexp 調用 search 方法,採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. string 爲 以 this 值作爲參數調用 ToString 的結果。
  3. 如果 Type(regexp) 是 Objectregexp [[Class]] 內部屬性的值是 "RegExp", 則令 rxregexpV8.png
  4. 否則,令 rx 爲彷彿是用表達式 new RegExp(regexp) 創建的新正則對象,這裏的 RegExp 是標準內置構造器名。
  5. string 開始位置搜索正則表達式模式 rx 的匹配。如果找到匹配,令 result 爲匹配在 string 裏的偏移量;如果沒有找到匹配,令 result-1。執行搜索時 regexplastIndexglobal 屬性是被忽略的。regexplastIndex 屬性保持不變。
  6. 返回 result
注: search 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.slice (start, end)

slice 方法需要兩個參數 startend,將 this 對象轉換爲一個字符串,返回這個字符串中從 start 位置的字符到(但不包含)end 位置的字符的一個子字符串(或如果 end undefined,就直接到字符串尾部)。用 sourceLength 表示字符串長度,如果 start 是負數,就把它看做是 sourceLength + start;如果 end 是負數,就把它看做是 sourceLength + end。返回結果是一個字符串值,不是字符串對象。採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. lenS 的字符數 .V8.png
  4. intStart ToInteger(start)。
  5. 如果 endundefined,令 intEndlen;否則 令 intEnd ToInteger(end)。
  6. 如果 intStartnegative,令 from max(len + intStart , 0);否則 令 from min(intStart , len)。
  7. 如果 intEndnegative,令 to max(len + intEnd, 0);否則 令 to min(intEndlen)。
  8. span max(to - from, 0 )。
  9. 返回 一個包含 Sform 位置的字符開始的 span 個連續字符 的字符串。V8.png

slice 方法的 length 屬性是 2

注: slice 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.split (separator, limit)

this 字符串轉換爲一個字符串,返回一個數組對象,裏面存儲了這個字符串的子字符串。子字符串是從左到右搜索 separator 的匹配來確定的;這些匹配結果不成爲返回數組的任何子字符串元素,但被用來分割字符串。separator 的值可以是一個任意長度的字符串,也可以是一個正則對象(即,一個 [[Class]] 內部屬性爲 "RegExp" 的對象;見 15.10)。

separator 值可以是一個空字符串、一個空正則表達式或一個可匹配空字符串的正則表達式。這種情況下,separator 不匹配輸入字符串開頭和末尾的空的子串,也不匹配分隔符的之前匹配結果末尾的空字串。(例如,如果 separator 是空字符串,要將字符串分割爲單個字符們;結果數組的長度等於字符串長度,且每個字串都包含一個字符。)如果 separator 是正則表達式,在 this 字符串的給定位置中只考慮首次匹配結果,即使如果在這個位置上回溯可產生一個非空的子串。(例如,"ab".split(/a*?/) 的執行結果是數組 ["a","b"],而 "ab".split(/a*/) 的執行結果是數組 ["","b"] 。)

如果 this 對象是(或轉換成)空字符串,返回的結果取決於 separator 是否可匹配空字符串。如果可以,結果是不包含任何元素的數組。否則,結果是包含一個空字符串元素的數組。

如果 separator 是包含捕獲括號的正則表達式,則對 separator 的每次匹配,捕獲括號的結果 ( 包括 undefined ) 都拼接爲輸出數組。

例如,

 "A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/)

執行結果是數組:

 ["A", undefined, "B", "bold", "/", "B", "and", undefined,
 "CODE", "coded", "/", "CODE", ""]

如果 separatorundefined,則返回結果是隻包含 this 值(轉換爲字符串)一個字符串元素的數組。如果 limit 不是 undefined,則輸出數組被切斷爲包含不大於 limit 個元素。V8.png


當調用 split 方法,採用以下步驟:V8.png V8.png V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. A 爲 彷彿使用表達式 new Array() 創建的新對象,這裏的 Array 是標準內置構造器名。
  4. lengthA0
  5. 如果 limitundefined,令 lim = 232 - 1; 否則 令 lim = ToUint32(limit)。
  6. sS 的字符數。
  7. p = 0
  8. 如果 separator 是正則對象(它的 [[Class]]"RegExp"),令 R = separator;否則,令 R = ToString(separator)。
  9. 如果 lim = 0,返回 A
  10. 如果 separatorundefined, 則
    1. "0"、屬性描述符 {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
    2. 返回 A
  11. 如果 s = 0,則
    1. 調用 SplitMatch(S, 0, R) 並 令 z 爲 它的 MatchResult 結果。
    2. 如果 z 不是 failure,返回 A
    3. "0"、屬性描述符 {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
    4. 返回 A
  12. q = p
  13. 只要 qs,就重複
    1. 調用 SplitMatch(S, q, R) 並 令 z 爲 它的 MatchResult 結果。
    2. 如果 zfailure, 則 令 q = q + 1
    3. 否則,z 不是 failure
      1. z 必定是一個 State。令 ezendIndex 並 令 capzcaptures 數組。
      2. 如果 e = p,則 令 q = q + 1
      3. 否則,ep
        1. T 爲一個字符串,它的值等於包含 在 Sp(包括它)位置到 q(不包括)位置的字符 的子字符串的值。
        2. ToString(lengthA)、屬性描述符 {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法 .
        3. lengthA 遞增 1
        4. 如果 lengthA = lim,返回 A
        5. p = e
        6. i = 0
        7. 只要 i 不等於 cap 中的元素個數,就重複。
          1. i = i + 1
          2. ToString(lengthA)、屬性描述符 {[[Value]]: cap[i], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
          3. lengthA 遞增 1
          4. 如果 lengthA = lim,返回 A
        8. q = p
  14. T 爲 爲一個字符串,它的值等於包含 在 Sp(包括它)位置到 q(不包括)位置的字符 的子字符串的值。
  15. ToString(lengthA)、屬性描述符 {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A [[DefineOwnProperty]] 內部方法。
  16. 返回 A


SplitMatch 抽象操作需要三個參數,字符串 S、整數 q、字符串或正則對象 R,按照以下順序執行並返回一個 MatchResult

  1. 如果 R 是個正則對象 ( 它的 [[Class]]"RegExp"),則
    1. Sq 作爲參數調用 R [[Match]] 內部方法,並返回 MatchResult 的結果。
  2. 否則,Type(R) 必定是 String。令 rR 的字符數。Note.png
  3. sS 的字符數 .
  4. 如果 q + r > s 則返回 MatchResult failure
  5. 如果存在一個在 0(包括)到 r(不包括)之間的整數 i,使得 Sq + i 位置上的字符和 Ri 位置上的字符不同,則返回 failure
  6. capcaptures 的空數組 ( 見 15.10.2.1)。
  7. 返回 State 數據結構 (q + r, cap). ( 見 15.10.2.1)

split 方法的 length 屬性是 2.

注: 分隔符是正則對象時,split 方法忽略 separator.global 的值。
注: split 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.substring (start, end)

substring 方法需要兩個參數 startend,將 this 對象轉換爲一個字符串,返回一個子串,這個子串包含了在轉換結果字符串中從 start 位置字符一直到(但不包括)end 位置的字符(或如果 endundefined,就到字符串末尾)。返回結果是字符串值,不是字符串對象。

如果任一參數是 NaN 或負數,它被零取代;如果任一參數大於字符串長度,它被字符串長度取代。

如果 start 大於 end,交換它們的值。

採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. lenS 的字符數。
  4. intStart ToInteger(start)。
  5. 如果 endundefined,令 intEndlen;否則 令 intEnd ToInteger(end)。
  6. finalStart min(max(intStart, 0 ), len)。
  7. finalEnd min(max(intEnd, 0 ), len)。
  8. from min(finalStart, finalEnd)。
  9. to max(finalStart, finalEnd)。
  10. 返回 一個長度是 to - from 的字符串,它包含 S 中從索引值 formto - 1(按照索引升序)的所有字符。 V8.png

substring 方法的 length 屬性是 2

注: substring 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.toLowerCase ( )

採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。V8.png
  3. L 爲一個字符串,L 的每個字符是 S 中相應字符的 Unicode 小寫等量,或者(如果沒有 Unicode 小寫等量存在)是實際的 S 中相應字符值。Note.png V8.png
  4. 返回 L

爲了此操作,字符串的16位代碼單元被看作是 Unicode 基本多文種平面中的代碼點。代理代碼點直接從 S 轉移到 L,不做任何映射。

返回結果必須是根據 Unicode 字符數據庫裏的大小寫映射得到的(對此數據庫明確規定,不僅包括 UnicodeData.txt 文件,而且還包括 Unicode 2.1.8 和更高版本里附帶的 SpecialCasings.txt 文件)。

注: 某些字符的大小寫映射可產生多個字符。這種情況下結果字符串與原字符串的長度未必相等。因爲 toUpperCase toLowerCase 都有上下文敏感的行爲,所以這倆函數不是對稱的。也就是說,s.toUpperCase().toLowerCase() 不一定等於 s.toLowerCase()
注: toLowerCase 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.toLocaleLowerCase ( )

此函數產生依照 宿主環境的當前語言設置 更正的結果,而不是獨立於語言環境的結果,除此之外它的運作方式與 toLowerCase 完全一樣。只有在少數情況下有一個區別(如,土耳其語),就是那個語言和正規 Unicode 大小寫映射有衝突時的規則。V8.png

注: 此函數的第一個參數可能會用於本標準的未來版本;建議實現不以任何用途使用這個參數位置。
注: toLocaleLowerCase 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.toUpperCase ( )

此函數的將字符映射到在 Unicode 字符數據庫中與其等值的大寫字符,除此之外此函數的行爲採用與 String.prototype.toLowerCase 完全相同的方式。V8.png

注: toUpperCase 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.toLocaleUpperCase ( )

此函數產生依照 宿主環境的當前語言設置 更正的結果,而不是獨立於語言環境的結果,除此之外它的運作方式與 toUpperCase 完全一樣。只有在少數情況下有一個區別(如,土耳其語),就是那個語言和正規 Unicode 大小寫映射有衝突時的規則。V8.png

注: 此函數的第一個參數可能會用於本標準的未來版本;建議實現不以任何用途使用這個參數位置。
注: toLocaleUpperCase 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。


String.prototype.trim ( )

採用以下步驟:V8.png

  1. this 值作爲參數調用 CheckObjectCoercible
  2. S 爲以 this 值作爲參數調用 ToString 的結果。
  3. T 爲一個字符串值,它是 S 的一個拷貝,並刪除了開頭和結尾中空白的。空白的定義是 空白字符 行終止符 的並集。V8.png
  4. 返回 T
注: trim 函數被有意設計成通用的;它不要求它的 this 值是字符串對象。因此,他可以當做方法轉移到其他類型對象。

String 實例的屬性

字符串實例從字符串原型對象繼承屬性,字符串實例的 [[Class]] 內部屬性值是 "String"。字符串實例還有 [[PrimitiveValue]] 內部屬性,length 屬性,和一組屬性名是數組索引的可遍歷屬性。

[[PrimitiveValue]] 內部屬性是代表這個字符串對象的字符串值。以數組索引命名的屬性對應字符串值裏的單字符。一個特殊的 [[GetOwnProperty]] 內部方法用來爲數組索引命名的屬性指定數字,值,和特性。

length

在代表這個字符串對象的字符串值裏的字符數。

一旦創建了一個字符串對象,這個屬性是不可變的。它有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

[[GetOwnProperty]] ( P )

數組對象使用一個,用在其他原生 ECMAscript 對象的 [[GetOwnProperty]] 內部方法的變化版。這個特殊內部方法用來給命名屬性添加訪問器,對應到字符串對象的單字符。V8.png

S 爲一個字符串對象,P 爲一個字符串。

當以屬性名 P 調用 S[[GetOwnProperty]] 內部方法,採用以下步驟:

  1. desc 爲 以 P 爲參數調用 S 的默認 [[GetOwnProperty]] 內部方法的結果。
  2. 如果 desc 不是 undefined,返回 desc
  3. 如果 ToString(abs( ToInteger(P ))) 與 P 的值不同,返回 undefined
  4. strS [[PrimitiveValue]] 內部屬性字符串值。
  5. index ToInteger(P)。
  6. lenstr 裏的字符數。
  7. 如果 lenindex,返回 undefined
  8. resultStr 爲一個長度爲 1 的字符串,裏面包含 str index 位置的一個字符,在這裏 str 中的第一個(最左邊)字符被認爲是在位置 0,下一個字符在位置 1,依此類推。
  9. 返回一個屬性描述符 { [[Value]]: resultStr, [[Enumerable]]: true, [[Writable]]: false, [[Configurable]]: false }

Boolean 對象


作爲函數調用 Boolean 構造器

當把 Boolean 作爲函數來調用,而不是作爲構造器,它執行一個類型轉換。


Boolean (value)

返回由 ToBoolean(value) 計算出的 Boolean 值(非 Boolean 對象)。V8.png


Boolean 構造器

Boolean 作爲 new 表達式的一部分來調用,那麼它是一個構造器:它初始化新創建的對象。


new Boolean (value)

新構造對象的 [[Prototype]] 內部屬性設定爲原始 Boolean 原型對象,它是 Boolean.prototype 的初始值。

新構造對象的 [[Class]] 內部屬性設定爲 "Boolean"

新構造對象的 [[PrimitiveValue]] 內部屬性設定爲 ToBoolean(value)。

新構造對象的 [[Extensible]] 內部屬性設定爲 true


Boolean 構造器的屬性

Boolean 構造器的 [[Prototype]] 內部屬性的值是 Function 原型對象

除了內部屬性和 length 屬性(值爲 1)外,Boolean 構造器還有以下屬性:


Boolean.prototype

Boolean.prototype 的初始值是 Boolean 原型對象V8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Boolean 原型對象的屬性

Boolean 原型對象自身是一個值爲 falseBoolean 對象(它的 [[Class]]"Boolean")。

Boolean 原型對象 [[Prototype]] 內部屬性值是標準的內置 Object 原型對象


Boolean.prototype.constructor

Boolean.prototype.constructor 的初始值是內置的 Boolean 構造器。V8.png


Boolean.prototype.toString ( )

採用以下步驟:

  1. Bthis 值。
  2. 如果 Type(B) 是 Boolean,則令 bB
  3. 否則如果 Type(B) 是 ObjectB [[Class]] 內部屬性值是 "Boolean",則令 bB [[PrimitiveValue]] 內部屬性值。
  4. 否則拋出一個 TypeError 異常。V8.png
  5. 如果 btrue,則返回 "true";否則返回 "false"


Boolean.prototype.valueOf ( )

採用以下步驟:

  1. Bthis 值。
  2. 如果 Type(B) 是 Boolean,則令 bB
  3. 否則如果 Type(B) 是 ObjectB [[Class]] 內部屬性值是 "Boolean",則令 bB [[PrimitiveValue]] 內部屬性值。
  4. 否則拋出一個 TypeError 異常。V8.png
  5. 返回 b


Boolean 實例的屬性

Boolean 實例從 Boolean 原型對象繼承屬性,且 Boolean 實例的 [[Class]] 內部屬性值是 "Boolean"Boolean 實例 還有一個 [[PrimitiveValue]] 內部屬性。

[[PrimitiveValue]] 內部屬性是代表這個 Boolean 對象的 Boolean 值。

Number 對象


作爲函數調用的 Number 構造器

當把 Number 當作一個函數來調用,而不是作爲構造器,它執行一個類型轉換。


Number ( [ value ] )

如果提供了 value,返回 ToNumber(value) 計算出的 Number 值(非 Number 對象),否則返回 +0V8.png


Number 構造器

當把 Number 作爲 new 表達式的一部分來調用,它是構造器:它初始化新創建的對象。


new Number ( [ value ] )

新構造對象的 [[Prototype]] 內部屬性設定爲原始 Number 原型對象,它是 Number.prototype 的初始值。

新構造對象的 [[Class]] 內部屬性設定爲 "Number"

新構造對象的 [[PrimitiveValue]] 內部屬性在提供了 value 時設定爲 ToNumber(value),否則設定爲 +0

新構造對象的 [[Extensible]] 內部屬性設定爲 true


Number 構造器的屬性

Number 構造器的 [[Prototype]] 內部屬性值是 Function 原型對象

除了內部屬性和 length 屬性(值爲 1)之外,Number 構造器還有以下屬性:


Number.prototype

Number.prototype 的初始值是 Number 原型對象V8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number.MAX_VALUE

Number.MAX_VALUE 的值是 Number 類型的最大正有限值,約爲 1.7976931348623157×10308V8.png Note.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number.MIN_VALUE

Number.MIN_VALUE 的值是 Number 類型的最小正有限值,約爲 5×10-324V8.png Note.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number.NaN

Number.NaN 的值是 NaNV8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY 的值是-∞V8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY 的值是 +∞V8.png

這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Number 原型對象的屬性

Number 原型對象其自身是 Number 對象(其 [[Class]]"Number"),其值爲 +0

Number 原型對象的 [[Prototype]] 內部屬性值是標準內置 Object 原型對象

除非另外明確聲明,以下定義的 Number 原型對象的方法是非通用的,傳遞給它們的 this 值必須是 Number 值或 [[Class]] 內部屬性值是 "Number" 的對象。

在以下對作爲 Number 原型對象屬性的函數的描述中,短語“this Number 對象”是指函數調用中的 this,或如果 Type( this ) 是 Number,“this Number 對象”指彷彿是用表達式 new Number( this ) 創建的對象,這裏 Number 是標準內置構造器名。此外,短語“this Number 值”是指代表 this Number 對象Number 值,也就是 this Number 對象 [[PrimitiveValue]] 內部屬性值;或如果 thisNumber 類型,“this Number 值”指 this。如果 this 值不是 [[Class]] 內部屬性爲 "Number" 的對象,也不是 Number 類型的值,則拋出一個 TypeError 異常。


Number.prototype.constructor

Number.prototype.constructor 的初始值是內置 Number 構造器。V8.png


Number.prototype.toString ( [ radix ] )

可選參數 radix 應當是 236 閉區間上的整數。如果 radix 不存在或是 undefined,用數字 10 作爲 radix 的值。如果 ToInteger(radix) 是數字 10,則將 this Number 對象 作爲一個參數傳給 ToString 抽象操作;返回結果字符串值。

如果 ToInteger( radix ) 不是在 236 閉區間上的整數,則拋出一個 RangeError 異常。如果 ToInteger( radix ) 是 236 的整數,但不是 10,則結果是 this Number 值 使用指定基數表示法的字符串。字母 a-z 用來指值爲 1035 的數字。基數不爲 10 時的精確算法是依賴於實現的,然而算法應當是 9.8.1 指定算法的推廣形式。

toString 函數不是通用的;如果 this 值不是數字或 Number 對象,拋出一個 TypeError 異常。因此它不能當作方法轉移到其他類型對象上。V8.png


Number.prototype.toLocaleString()

根據宿主環境的當前語言環境慣例來格式化 this Number 值,生成代表這個值的字符串。此函數是依賴於實現的,允許但不鼓勵它的返回值與 toString 相同。V8.png

注: 此函數的第一個參數可能會用於本標準的未來版本 ; 建議實現不以任何用途使用這個參數位置。


Number.prototype.valueOf ( )

返回 this Number 值

valueOf 函數不是通用的;如果 this 值不是數字或 Number 對象,拋出一個 TypeError 異常。因此它不能當作方法轉移到其他類型對象上。V8.png


Number.prototype.toFixed (fractionDigits)

返回一個包含了 代表 this Number 值的留有小數點後 fractionDigits 個數字的十進制固定小數點記法 的字符串。如果 fractionDigitsundefined,就認爲是 0。具體來說,執行以下步驟:V8.png

  1. f ToInteger(fractionDigits)。(如果 fractionDigits undefined,此步驟產生 0 值。)
  2. 如果 f < 0f > 20,拋出一個 RangeError 異常。V8.png
  3. xthis Number 值
  4. 如果 xNaN,返回字符串 "NaN"V8.png
  5. s 爲空字符串。
  6. 如果 x < 0,則
    1. s"-"
    2. x = -x
  7. 如果 x1021,則
    1. m = ToString(x)。
  8. 否則,x < 1021
    1. n 爲一個整數,讓 n ÷ 10f - x 準確的數學值儘可能接近零。如果有兩個這樣 n 值,選擇較大的 nNote.png
    2. 如果 n = 0,令 m 爲字符串 "0"。否則,令 m 爲由 n 的十進制表示裏的數 組成的字符串(爲了沒有前導零)。
    3. 如果 f0,則
      1. km 裏的字符數目。
      2. 如果 kf,則
        1. zf + 1 - k'0' 組成的字符串。
        2. m 爲 串聯字符串 zm 的結果。
        3. k = f + 1
      3. am 的前 kf 個字符,令 b 爲其餘 f 個字符。
      4. m 爲 串聯三個字符串 a"."b 的結果。
  9. 返回串聯字符串 sm 的結果。

toFixed 方法的 length 屬性是 1

如果以多個參數調用 toFixed 方法,則行爲是不確定的(見15章)。

實現是被允許在 fractionDigits 小於 0 或大於 20 時擴展 toFixed 的行爲。在這種情況下,對這樣的 fractionDigitstoFixed 將未必拋出 RangeError

注: 對於某些值,toFixed 的輸出可比 toString 的更精確,因爲 toString 只打印區分相鄰 Number 值的足夠的有效數字。例如,Note.png

(1000000000000000128).toString() 返回 "1000000000000000100"

(1000000000000000128).toFixed(0) 返回 "1000000000000000128"


Number.prototype.toExponential (fractionDigits)

返回一個代表 this Number 值 的科學計數法的字符串,它的有效數字的小數點前有一個數字,有效數字的小數點後有 fractionDigits 個數字。如果 fractionDigitsundefined,包括指定唯一 Number 值需要的儘可能多的有效數字(就像 ToString,但在這裏總是以科學計數法輸出)。具體來說執行以下步驟:V8.png

  1. xthis Number 值
  2. f ToInteger(fractionDigits)。
  3. 如果 xNaN,返回字符串 "NaN"
  4. s 爲空字符串。
  5. 如果 x < 0,則
    1. s"-"
    2. x = -x
  6. 如果 x = +∞,則
    1. 返回串聯字符串 s"Infinity" 的結果。
  7. 如果 fractionDigits 不是 undefined 且(f < 0f > 20),拋出一個 RangeError 異常。V8.png
  8. 如果 x = 0,則
    1. f = 0
    2. m 爲包含 f + 1'0' 的字符串。
    3. e = 0
  9. 否則,x0
    1. 如果 fractionDigits 不是 undefined,則
      1. en 爲整數,使得滿足 10fn < 10f+1 n × 10e-f - x 的準確數學值儘可能接近零。如果 en 有兩個這樣的組合,選擇使 n × 10e-f 更大的組合。
    2. 否則,fractionDigitsundefined
      1. enf 爲整數,使得滿足 f010fn < 10f+1n × 10e-fNumber 值是 x,且 f 的值儘可能小。注:n 的十進制表示有 f + 1 個數字,n 不能被 10 整除,並且 n 的最少有效位數不一定唯一由這些條件確定。
    3. m 爲由 n 的十進制表示裏的數 組成的字符串(沒有前導零)。
  10. 如果 f0,則
    1. am 中的第一個字符,令 bm 中的其餘字符。
    2. m 爲串聯三個字符串 a"."b 的結果。
  11. 如果 e = 0,則
    1. c = "+"
    2. d = "0"
  12. 否則
    1. 如果 e > 0,則 令 c = "+"
    2. 否則,e0
      1. c = "-"
      2. e = -e
    3. d 爲有 e 的十進制表示裏的數 組成的字符串(沒有前導零)。
  13. m 爲串聯四個字符串 m"e"c d 的結果。
  14. 返回串聯字符串 sm 的結果。

toExponential 方法的 length 屬性是 1

如果用多於一個參數調用 toExponential 方法,則行爲是未定義的(見15章)。

一個實現可以擴展 fractionDigits 的值小於 0 或大於 20toExponential 的行爲。這種情況下對這樣的 fractionDigits 值,toExponential 不一定拋出 RangeError 異常。

注: 對於需要提供比上述規則更準確轉換的實現,建議用以下算法作爲指引替代步驟 9.2.1
  1. enf 爲整數,使得滿足 f010fn < 10f+1n × 10e-fNumber 值是 x,且 f 的值儘可能小。如果這樣的 n 值可能多個,選擇使 n × 10e-f 的值儘可能接近 xn 值。如果有兩個這樣的 n 值,選擇偶數。


Number.prototype.toPrecision (precision)

返回一個字符串,它代表 this Number 值 的科學計數法(有效數字的小數點前有一個數字,有效數字的小數點後有 precision - 1 個數字)或十進制固定計數法(precision 個有效數字)。如果 precisionundefined,用 ToString 調用代替。具體來說執行以下步驟:V8.png

  1. xthis 數字值。
  2. 如果 precisionundefined,返回 ToString(x)。
  3. p ToInteger(precision)。
  4. 如果 x 是 NaN,返回字符串 "NaN"
  5. s 爲空字符串。
  6. 如果 x < 0,則
    1. s"-"
    2. x = -x
  7. 如果 x = +∞,則
    1. 返回串聯字符串 s"Infinity" 的結果。
  8. 如果 p < 1p > 21,拋出一個 RangeError 異常。V8.png
  9. 如果 x = 0,則
    1. mp'0' 組成的字符串。
    2. e = 0
  10. 否則 x0
    1. en 爲整數,使得滿足 10p-1n < 10pn × 10e-p+1 - x 的準確數學值儘可能接近零。如果 en 有兩個這樣的組合,選擇使 n × 10e-p+1 更大的組合。
    2. m 爲由 n 的十進制表示裏的數 組成的字符串(沒有前導零)。
    3. 如果 e < -6ep。則
      1. an 的第一個字符,令 bm 的其餘 p-1 個字符/
      2. m 爲串聯三個字符串 a"."b 的結果。
      3. 如果 e = 0,則
        1. c = "+",令 d = "0"
      4. 否則 e0
        1. 如果 e > 0,則
          1. c = "+"
        2. 否則 e < 0
          1. c = "-"
          2. e = -e
        3. d 爲由 e 的十進制表示裏的數 組成的字符串(沒有前導零)。
      5. m 爲串聯五個字符串 sm"e"cd 的結果。
  11. 如果 e = p - 1,則返回串聯字符串 s m 的結果。
  12. 如果 e0,則
    1. mm 的前 e + 1 個字符,字符 '.'m 的其餘 p - (e + 1) 個字符 串聯的結果。
  13. 否則 e < 0
    1. m 爲 字符串 "0."、- (e + 1) 個字符 '0'、字符串 m 串聯的結果。
  14. 返回字符串 sm 串聯的結果。

toPrecision 方法的 length 屬性是 1

如果用多於一個參數調用 toPrecision 方法,則行爲是未定義的(見15章)。

一個實現可以擴展 precision 的值小於 1 或大於 21toPrecision 的行爲。這種情況下對這樣的 precision 值,toPrecision 不一定拋出 RangeError 異常。


Number 實例的屬性

Number 實例從 Number 原型對象繼承屬性,Number 實例的 [[Class]] 內部屬性是 "Number"Number 實例還有一個 [[PrimitiveValue]] 內部屬性。

[[PrimitiveValue]] 內部屬性是代表 this Number 對象Number 值。

Math 對象

Math 對象是擁有一些命名屬性的單一對象,其中一些屬性值是函數。

Math 對象的 [[Prototype]] 內部屬性值是標準內置 Object 原型對象 (15.2.4)。Math 對象的 [[Class]] 內部屬性值是 "Math"

Math 對象沒有 [[Construct]] 內部屬性 ; Math 對象不能作爲構造器被 new 運算符調用。

Math 對象沒有 [[Call]] 內部屬性;Math 對象不能作爲函數被調用。

注: 本規範中,短語“x 的 Number 值”的技術含義定義在 8.5。Note.png


Math 對象的值屬性


E

自然對數的底數 eNumber 值,約爲 2.7182818284590452354V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。


LN10

10 的自然對數的 Number 值,約爲 2.302585092994046V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。

LN2

2 的自然對數的 Number 值,約爲 0.6931471805599453V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。


LOG2E

自然對數的底數 e 的以 2 爲底數的對數的 Number 值;約爲 1.4426950408889634V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。

注:Math.LOG2E 的值約爲 Math.LN2 值的倒數。


LOG10E

自然對數的底數 e 的以 10 爲底數的對數的 Number 值;約爲 0.4342944819032518V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。

注:Math.LOG10E 的值約爲 Math.LN10 值的倒數。


PI

圓的周長與直徑之比 πNumber 值,約爲 3.1415926535897932V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。


SQRT1_2

½ 的平方根的 Number 值,約爲 0.7071067811865476V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。

注:Math.SQRT1_2 的值約爲 Math.SQRT2 值的倒數。


SQRT2

2 的平方根的 Number 值,約爲 1.4142135623730951V8.png

此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。


Math 對象的函數屬性

對以下每個 Math 對象函數的每個參數(如果有多個,以左到右的順序)應用 ToNumber 抽象操作,然後對結果 Number 值執行計算。

下面對函數的描述中,符號 NaN-0+0-∞+∞ 8.5 描述的 Number 值。

注:這裏沒有精確規定函數 acosasinatanatan2cosexplogpowsinsqrttan 的行爲,除了需要特別說明對邊界情況某些參數值的結果之外。對其他參數值,這些函數指在計算常見數學函數的結果,但選擇的近似算法中的某些範圍是被允許的。一般意圖是實現者應該可以爲ECMAScript在一個給定的硬件平臺上使用相同的數學庫,那是在平臺上對C程序員們有用的。

儘管算法的選擇由實現來決定的,但它被推薦(不是由這個標準指定)使用包含在fdlibm的IEEE754算法的近似算法來實現,這個可以自由分配的數學庫來自Sun公司(http://www.netlib.org/fdlibm).


abs (x)

返回 x 的絕對值。V8.png

  • xNaN,返回結果是 NaN
  • x-0,返回結果是 +0
  • x-∞,返回結果是 +∞


acos (x)

返回 x 的反餘弦的依賴實現的近似值。結果以弧度形式表示,範圍是 +0V8.png

  • xNaN,返回結果是 NaN
  • x 大於 1,返回結果是 NaN
  • x 小於 -1,返回結果是 NaN
  • x 正好是 1,返回結果是 +0


asin (x)

返回 x 的反正弦的依賴實現的近似值。結果以弧度形式表示,範圍是 -π/2+π/2V8.png

  • xNaN,返回結果是 NaN
  • x 大於 1,返回結果是 NaN
  • x 小於 –1,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0


atan (x)

返回 x 的反正切的依賴實現的近似值。結果以弧度形式表示,範圍是 -π/2+π/2V8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞,返回結果是 一個依賴於實現的近似值 +π/2
  • x-∞,返回結果是 一個依賴於實現的近似值 -π/2


atan2 (y, x)

返回 參數 yx 的商 y / x 的反正切 的依賴實現的近似值,yx 的符號用於確定返回值的象限。注:命名爲 y 的參數爲第一個,命名爲 x 的參數爲第二個,這是有意的,是反正切函數倆參數的慣例。結果以弧度形式表示,範圍是 V8.png

  • xy 至少一個是 NaN,返回結果是 NaN
  • y > 0x+0,返回結果是 一個依賴於實現的近似值 +π/2
  • y > 0x-0,返回結果是 一個依賴於實現的近似值 +π/2
  • y+0x > 0,返回結果是 +0
  • y+0x+0,返回結果是 +0
  • y+0x-0,返回結果是 一個依賴於實現的近似值
  • y+0x < 0,返回結果是 一個依賴於實現的近似值
  • y-0x > 0,返回結果是 -0
  • y-0x+0,返回結果是 -0
  • y-0x-0,返回結果是 一個依賴於實現的近似值
  • y-0x < 0,返回結果是 一個依賴於實現的近似值
  • y < 0x+0,返回結果是 一個依賴於實現的近似值 -π/2
  • y < 0x-0,返回結果是 一個依賴於實現的近似值 -π/2
  • y > 0y 是 有限的 且 x +∞,返回結果是 +0
  • y > 0y 是 有限的 且 x -∞,返回結果是 一個依賴於實現的近似值
  • y < 0y 是 有限的 且 x +∞,返回結果是 -0
  • y < 0y 是 有限的 且 x -∞,返回結果是 一個依賴於實現的近似值
  • y+∞x 是 有限的,返回結果是 返回結果是 一個依賴於實現的近似值 +π/2。
  • y-∞x 是 有限的,返回結果是 返回結果是 一個依賴於實現的近似值 -π/2。
  • y+∞x+∞,返回結果是 一個依賴於實現的近似值 +π/4
  • y+∞x-∞,返回結果是 一個依賴於實現的近似值 +3π/4
  • y-∞x+∞,返回結果是 一個依賴於實現的近似值 -π/4
  • y-∞x-∞,返回結果是 一個依賴於實現的近似值 -3π/4


ceil (x)

返回不小於 x 的且爲數學整數的最小 ( 接近 -∞ ) Number 值。如果 x 已是整數,則返回 xV8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞,返回結果是 +∞
  • x-∞,返回結果是 -∞
  • x 小於 0 但大於 -1,返回結果是 -0
注:Math.ceil(x) 的值與 -Math.floor(-x) 的值相同。


cos (x)

返回 x 的餘弦的依賴實現的近似值。參數被當做是弧度值。V8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 1
  • x-0,返回結果是 1
  • x+∞,返回結果是 NaN
  • x-∞,返回結果是 NaN


exp (x)

返回 x 的指數的依賴實現的近似值(ex 次方,e 爲自然對數的底)。V8.png

  • 若 x 是 NaN, 返回結果是 NaN.
  • 若 x 是 +0, 返回結果是 1.
  • 若 x 是 -0, 返回結果是 1.
  • 若 x 是 +∞, 返回結果是 +∞.
  • 若 x 是 -∞, 返回結果是 +0.

floor (x)

返回不大於 x 的且爲數學整數的最大 ( 接近 +∞ ) Number 值。如果 x 已是整數,則返回 xV8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞,返回結果是 +∞
  • x-∞,返回結果是 -∞
  • x 大於 0 但小於 1,返回結果是 +0
注:Math.floor(x) 的值與 -Math.ceil(-x) 的值相同。


log (x)

返回 x 的自然對數的依賴於實現的近似值。V8.png

  • xNaN,返回結果是 NaN
  • x 小於 0,返回結果是 NaN
  • x+0-0,返回結果是 -∞
  • x1,返回結果是 +0
  • x+∞,返回結果是 +∞


max ( [ value1 [ , value2 [ , … ] ] ] )

給定零或多個參數,對每個參數調用 ToNumber 並返回調用結果裏的最大值。V8.png

  • 若 沒有給定參數,返回結果是 -∞
  • 若 任何值是 NaN,返回結果是 NaN
  • 按照 11.8.5 指定方式進行值比較,確定最大值,與 11.8.5 指定方式的一個不同點是在這裏 +0 被看作大於 -0

max 方法的 length 屬性是 2


min ( [ value1 [ , value2 [ , … ] ] ] )

給定零或多個參數,對每個參數調用 ToNumber 並返回調用結果裏的最小值。V8.png

  • 若 沒有給定參數,返回結果是 +∞
  • 若 任何值是 NaN,返回結果是 NaN
  • 按照 11.8.5 指定方式進行值比較,確定最小值,與 11.8.5 指定方式的一個不同點是在這裏 +0 被看作大於 -0

min 方法的 length 屬性是 2


pow (x, y)

返回 xy 次方的依賴於實現的近似值。V8.png

  • yNaN,返回結果是 NaN
  • y+0,返回結果是 1,即使 xNaN
  • y-0,返回結果是 1,即使 xNaN
  • xNaNy 是 非零,返回結果是 NaN
  • abs(x) > 1y+∞,返回結果是 +∞
  • abs(x) > 1y-∞,返回結果是 +0
  • abs(x) == 1y+∞,返回結果是 NaN
  • abs(x) == 1y-∞,返回結果是 NaN
  • abs(x) < 1y+∞,返回結果是 +0
  • abs(x) < 1y-∞,返回結果是 +∞
  • x+∞y > 0,返回結果是 +∞
  • x+∞y < 0,返回結果是 +0
  • x-∞y > 0 y 是 一個奇數,返回結果是 -∞
  • x-∞y > 0 y 不是 一個奇數,返回結果是 +∞
  • x-∞y < 0 y 是 一個奇數,返回結果是 -0
  • x-∞y < 0 y 不是 一個奇數,返回結果是 +0
  • x+0y > 0,返回結果是 +0
  • x+0y < 0,返回結果是 +∞
  • x-0y > 0 y 是 一個奇數,返回結果是 -0
  • x-0y > 0 y 不是 一個奇數,返回結果是 +0
  • x-0y < 0 y 是 一個奇數,返回結果是 -∞
  • x-0y < 0 y 不是 一個奇數,返回結果是 +∞
  • x < 0x 是有限的 且 y 是有限的 且 y 不是整數,返回結果是 NaN


random ( )

返回一個大於或等於 0 但小於 1 的符號爲正的 Number 值,選擇隨機或在該範圍內近似均勻分佈的僞隨機,用一個依賴與實現的算法或策略。此函數不需要參數。V8.png


round (x)

返回最接近 x 且爲數學整數的 Number 值。如果兩個整數同等接近 x,則結果是接近 +∞Number 值 。如果 x 已是整數,則返回 xV8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞,返回結果是 +∞
  • x-∞,返回結果是 -∞
  • x 大於 0 但小於 0.5,返回結果是 +0
  • x 小於 0 但大於或等於 -0.5,返回結果是 -0
注: Math.round(3.5) 返回 4,但 Math.round(-3.5) 返回 -3
注: 當 x-0x 小於 0 且大於等於 -0.5 時,Math.round(x) 返回 -0,而 Math.floor(x+0.5) 返回 +0。除了這種情況之外 Math.round(x) 的返回值與 Math.floor(x+0.5) 的返回值相同。


sin (x)

返回 x 的正弦的依賴實現的近似值。參數被當做是弧度值。V8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞-∞,返回結果是 NaN


sqrt (x)

返回 x 的平方根的依賴實現的近似值。V8.png

  • xNaN,返回結果是 NaN
  • x 小於 0,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞,返回結果是 +∞


tan (x)

返回 x 的正切的依賴實現的近似值。參數被當做是弧度值。V8.png

  • xNaN,返回結果是 NaN
  • x+0,返回結果是 +0
  • x-0,返回結果是 -0
  • x+∞-∞,返回結果是 NaN

Date 對象


Date 對象的概述和抽象操作的定義

下面的抽象操作函數用來操作時間值(15.9.1.1 定義)。注:任何情況下,如果這些函數之一的任意參數是 NaN,則結果將是 NaN


時間值和時間範圍

一個 Date 對象包含一個表示特定時間瞬間的毫秒的數字值。這樣的數字值叫做時間值。一個時間值也可以是 NaN,說明這個 Date 對象不表示特定時間瞬間。

ECMAScript 中測量的時間是從協調世界時 1970 年 1 月 1 日 開始的毫秒數。在時間值中閏秒是被忽略的,假設每天正好有 86,400,000 毫秒。ECMAScript 數字值可表示的所有從-9,007,199,254,740,9919,007,199,254,740,991 的整數;這個範圍足以衡量協調世界時 1970 年 1 月 1 日 前後約 285,616 年 內任何時間瞬間的精確毫秒。

ECMAScript Date 對象支持的實際時間範圍是略小一些的:相對協調世界時 1970 年 1 月 1 日 午夜 0 點的精確的 -100,000,000 天到 100,000,000 天。這給出了協調世界時 1970 年 1 月 1 日 前後 8,640,000,000,000,000 毫秒的範圍。

精確的協調世界時 1970 年 1 月 1 日 午夜 0 點用 +0 表示。


天數和天內時間

一個給定時間值 t 所屬的天數是 Note.png

 Day(t) = floor(t / msPerDay)

其中每天的毫秒數是

 msPerDay = 86400000 V8.png

餘數叫做天內時間

 TimeWithinDay(t) = t modulo msPerDay


年數

ECMAScript 使用一個推算公曆系統,來將一個天數映射到一個年數,並確定在那年的月份的日期。在這個系統中,閏年是且僅是(可被 4 整除)且((不可被 100 整除)或(可被 400 整除))的年份。因此,y 年的天的數目定義爲

 DaysInYear(y) = 365 { 如果 (y modulo 4) ≠ 0 }
                 = 366 { 如果 (y modulo 4) = 0 且 (y modulo 100) ≠ 0 }
                 = 365 { 如果 (y modulo 100) = 0 且 (y modulo 400) ≠ 0 }
                 = 366 { 如果 (y modulo 400) = 0 }

所有非閏年有 365 天,其中每月的天的數目是常規的。閏年的二月裏有個多出來的一天。 y 年第一天的天數是 : Note.png

 DayFromYear(y) = 365 × (y - 1970) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601)/400)

y 年的起始時間值是:

 TimeFromYear(y) = msPerDay × DayFromYear(y)

一個時間值決定的年數是:

 YearFromTime(t) = 滿足條件 TimeFromYear(y) ≤ t 的最大整數 y (接近正無窮)

若時間值在閏年內,閏年函數返回 1,否則返回 0

 InLeapYear(t) = 0 { 如果 DaysInYear(YearFromTime(t)) = 365 }
               = 1 { 如果 DaysInYear(YearFromTime(t)) = 366 }


月數

月份是由閉區間 011 內的一個整數確定。一個時間值 t 到一個月數的映射 MonthFromTime(t) 的定義爲:

 MonthFromTime(t) = 0 如果 0DayWithinYear(t) < 31
                    = 1 如果 31DayWithinYear (t) < 59 + InLeapYear(t)
                    = 2 如果 59 + InLeapYear(t) ≤ DayWithinYear (t) < 90 + InLeapYear(t)
                    = 3 如果 90 + InLeapYear(t) ≤ DayWithinYear (t) < 120 + InLeapYear(t)
                    = 4 如果 120 + InLeapYear(t) ≤ DayWithinYear (t) < 151 + InLeapYear(t)
                    = 5 如果 151 + InLeapYear(t) ≤ DayWithinYear (t) < 181 + InLeapYear(t)
                    = 6 如果 181 + InLeapYear(t) ≤ DayWithinYear (t) < 212 + InLeapYear(t)
                    = 7 如果 212 + InLeapYear(t) ≤ DayWithinYear (t) < 243 + InLeapYear(t)
                    = 8 如果 243 + InLeapYear(t) ≤ DayWithinYear (t) < 273 + InLeapYear(t)
                    = 9 如果 273 + InLeapYear(t) ≤ DayWithinYear (t) < 304 + InLeapYear(t)
                    = 10 如果 304 + InLeapYear(t) ≤ DayWithinYear (t) < 334 + InLeapYear(t)
                    = 11 如果 334 + InLeapYear(t) ≤ DayWithinYear (t) < 365 + InLeapYear(t)

其中

 DayWithinYear(t) = Day(t) - DayFromYear(YearFromTime(t))

月數值 0 指一月;1 指二月;2 指三月;3 指四月;4 指五月;5 指六月;6 指七月;7 指八月;8 指九月;9 指十月;10 指十一月;11 指十二月。注:MonthFromTime(0) = 0,對應 1970 年 1 月 1 日,星期四。


日期數

一個日期數用閉區間 131 內的一個整數標識。從一個時間值 t 到一個日期數的映射 DateFromTime(t) 的定義爲:

 DateFromTime(t) = DayWithinYear(t) + 1 如果 MonthFromTime(t) = 0
   = DayWithinYear(t) - 30 如果 MonthFromTime(t) = 1
   = DayWithinYear(t) - 58 - InLeapYear(t) 如果 MonthFromTime(t) = 2
   = DayWithinYear(t) - 89 - InLeapYear(t) 如果 MonthFromTime(t) = 3
   = DayWithinYear(t) - 119 - InLeapYear(t) 如果 MonthFromTime(t) = 4
   = DayWithinYear(t) - 150 - InLeapYear(t) 如果 MonthFromTime(t) = 5
   = DayWithinYear(t) - 180 - InLeapYear(t) 如果 MonthFromTime(t) = 6
   = DayWithinYear(t) - 211 - InLeapYear(t) 如果 MonthFromTime(t) = 7
   = DayWithinYear(t) - 242 - InLeapYear(t) 如果 MonthFromTime(t) = 8
   = DayWithinYear(t) - 272 - InLeapYear(t) 如果 MonthFromTime(t) = 9
   = DayWithinYear(t) - 303 - InLeapYear(t) 如果 MonthFromTime(t) = 10
   = DayWithinYear(t) - 333 - InLeapYear(t) 如果 MonthFromTime(t) = 11


星期數

特定時間值 t 對應的星期數的定義爲:

 WeekDay(t) = (Day(t) + 4) modulo 7

星期數的值 0 指星期日;1 指星期一;2 指星期二;3 指星期三;4 指星期四;5 指星期五;6 指星期六。注:WeekDay(0) = 4,對應 1970 年 1 月 01 日 星期四。


本地時區校準

期望一個 ECMAScript 的實現確定本地時區校準。本地時區校準是一個毫秒爲單位的值 LocalTZA,它加上 UTC 代表本地標準時間。LocalTZA 不體現夏令時。LocalTZA 值不隨時間改變,但只取決於地理位置。


夏令時校準

期望一個 ECMAScript 的實現確定夏令時算法。確定夏令時校準的算法 DaylightSavingTA(t),以毫秒爲單位,必須只依賴下面四個項目:

(1)自本年開始以來的時間

 t - TimeFromYear(YearFromTime(t))

(2)t 是否在閏年內

 InLeapYear(t)

(3)本年第一天的星期數

 WeekDay(TimeFromYear(YearFromTime(t))

(4)地理位置。

ECMAScript的實現不應該嘗試確定精確時間是否是夏令時,如果當前的夏令時算法已經被用在了時間上也只是確定夏令時會不會一直影響。這樣避免了衝突,例如考慮到本地觀測全年的夏令時。如果宿主環境提供確定夏令時的功能,ECMAScript的實現自由映射有問題的年份到一個同等的年(相同的閏日和開始的星期)來爲宿主環境提供夏令時信息。唯一的限制是它應該在處理相同的年時候產生相同的結果。


本地時間

從協調世界時到本地時間的轉換,定義爲

 LocalTime(t) = t + LocalTZA + DaylightSavingTA(t)

從本地時間到協調世界時的轉換,定義爲

 UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
注: UTC(LocalTime(t)) 不一定總是等於 t


小時、分鐘、秒、毫秒

以下函數用於分解時間值:

 HourFromTime(t) = floor(t / msPerHour) modulo HoursPerDay
 MinFromTime(t) = floor(t / msPerMinute) modulo MinutesPerHour
 SecFromTime(t) = floor(t / msPerSecond) modulo SecondsPerMinute
 msFromTime(t) = t modulo msPerSecond

其中 V8.png

 HoursPerDay = 24
 MinutesPerHour = 60
 SecondsPerMinute = 60
 msPerSecond = 1000
 msPerMinute = 60000 = msPerSecond × SecondsPerMinute
 msPerHour = 3600000 = msPerMinute × MinutesPerHour


MakeTime (hour, min, sec, ms)

MakeTime 抽象操作用它的四個參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:V8.png

  1. 如果 hour 不是有限的或 min 不是有限的或 sec 不是有限的或 ms 不是有限的,返回 NaN
  2. h ToInteger(hour)。
  3. m ToInteger(min)。
  4. s ToInteger(sec)。
  5. milli ToInteger(ms)。
  6. th × msPerHour + m × msPerMinute + s × msPerSecond + milli,執行的四則運算根據 IEEE 754 規則(這就像使用 ECMAScript 運算符 × 和 + 一樣)。
  7. 返回 t


MakeDay (year, month, date)

MakeDay 抽象操作用它的三個參數算出一個天數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:V8.png

  1. 如果 year 不是有限的或 month 不是有限的或 date 不是有限的,返回 NaN
  2. y ToInteger(year)。
  3. m ToInteger(month)。
  4. dt ToInteger(date)。
  5. ymy + floor(m / 12)。
  6. mnm modulo 12
  7. 找一個滿足 YearFromTime(t) == ym MonthFromTime(t) == mn DateFromTime(t) == 1t 值;但如果這些條件是不可能的(因爲有些參數超出了範圍),返回 NaN
  8. 返回 Day(t) + dt - 1


MakeDate (day, time)

MakeDate 抽象操作用它的兩個參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:V8.png

  1. 如果 day 不是有限的或 time 不是有限的,返回 NaN
  2. 返回 day × msPerDay + time


TimeClip (time)

TimeClip 抽象操作用它的參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:V8.png

  1. 如果 time 不是有限的 , 返回 NaN
  2. 如果 abs(time) > 8.64×1015, 返回 NaN
  3. 返回 ToInteger(time) 和 ToInteger(time) + (+0) 之一,這依賴於實現 ( 加正一是爲了將 -0 轉換成 +0 )。
注: 第3步的重點是說允許實現自行選擇時間值的內部表示形式,如64位有符號整數或64位浮點數。根據不同的實現,這個內部表示可能區分也可能無法區分 -0+0


日期時間字符串格式

ECMAScript 定義了一個基於簡化的 ISO 8601 擴展格式的日期時間的字符串互換格式,格式爲:YYYY-MM-DDTHH:mm:ss.sssZ

其中個字段爲:

YYYY 是公曆中年的十進制數字。
- 在字符串中直接以“-”(連字符)出現兩次。
MM 是一年中的月份,從 01(一月)到 12(十二月)。
DD 是月份中的日期,從 0131
T 在字符串中直接以“T”出現,用來表明時間元素的開始。
HH 是用兩個十進制數字表示的,自 午夜0點 以來的小時數。
: 在字符串中直接以“:”(冒號)出現兩次。
mm 是用兩個十進制數字表示的,自小時開始以來的分鐘數。
ss 是用兩個十進制數字表示的,自分開始以來的秒數。
. 在字符串中直接以“.”(點)出現。
sss 是用三個十進制數字表示的,自秒開始以來的毫秒數。
Z 是時區偏移量,由(“Z”(指 UTC)或 “+”“-”)和後面跟着的時間表達式 hh:mm 組成。


這個格式包括只表示日期的形式:

 YYYY
 YYYY-MM
 YYYY-MM-DD

這個格式還包括“日期時間”形式,它由上面的只表示日期的形式之一和緊跟在後面的“T”和以下時間形式之一和可選的時區偏移量組成:

 THH:mm
 THH:mm:ss
 THH:mm:ss.sss

所有數字必須是十進制的。如果缺少 MMDD 字段,用 “01” 作爲它們的值。如果缺少 mmss 字段,用 “00” 作爲它們的值,對於缺少的 sss“000” 作爲它的值。對於缺少的時區偏移量用 “Z”

一個格式字符串裏有非法值(越界以及語法錯誤),意味着這個格式字符串不是有效的本節描述格式的實例。

注: 由於每天的開始和結束都在午夜,倆符號 00:0024:00 可區分這樣的可以是同一時間的兩個午夜。這意味着兩個符號 1995-02-04T24:00 和 1995-02-05T00:00 精準的指向同一時刻。
注: 不存在用來規範像 CET,EST 這樣的民間時區縮寫的國際標準。有時相同的縮寫甚至使用不同的時區。出於這個原因,ISO 8601 和這裏的格式指定數字來表示時區。


擴展的年

ECMAScript 需要能表示6位數年份(擴展的年份)的能力;協調世界時 1970年1月1日 前後分別約 285,616 年。對於表示 0年 之前或 9999年 之後的年份,ISO 8601 允許對年的表示法進行擴展,但只能在發送和接受信息的雙方有事先共同約定的情況下才能擴展。在已經簡化的 ECMAScript 的格式中這樣擴展的年份表示法有2個額外的數字和始終存在的前綴符號 +-0年 被認爲是正的,因此用 + 符號作爲前綴。


作爲函數調用 Date 構造器

當把 Date 作爲函數來調用,而不作爲構造器,它返回一個表示當前時間(協調世界時)的字符串。

注: 函數調用 Date(…) 的結果和用相同參數調用表達式 new Date(…) 創建的對象是不同的。


Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] )

所有參數都是可選的;接受提供的任何參數,但被完全忽略。返回一個彷彿是用表達式 (new Date()).toString() 創建的字符串,這裏的 Date 是標準內置構造器,toString 是標準內置方法 Date.prototype.toStringV8.png


Date 構造器

當把 Date 作爲 new 表達式的一部分來調用,它是個構造器:它初始化新創建的對象。


new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

當用二到七個參數調用 Date 構造器,它用 yearmonth 還有(可選的)datehoursminutessecondsms 來計算時間。

新構造對象的 [[Prototype]] 內部屬性設定爲原始的時間原型對象,它是 Date.prototype 的初始值。

新構造對象的 [[Class]] 內部屬性設定爲 "Date"

新構造對象的 [[Extensible]] 內部屬性設定爲 ture

新構造對象的 [[PrimitiveValue]] 內部屬性按照以下步驟設定:

  1. y ToNumber(year)。
  2. m ToNumber(month)。
  3. 如果提供了 date,則令 dt ToNumber(date);否則令 dt1
  4. 如果提供了 hours,則令 h ToNumber(hours);否則令 h0
  5. 如果提供了 minutes,則令 min ToNumber(minutes);否則令 min0
  6. 如果提供了 seconds,則令 s ToNumber(seconds);否則令 s0
  7. 如果提供了 ms,則令 milli ToNumber(ms);否則令 milli0
  8. 如果 y 不是 NaN0 ToInteger(y) ≤ 99,則令 yr1900+ToInteger(y);否則令 yry
  9. finalDate MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))。
  10. 設定新構造對象的 [[PrimitiveValue]] 內部屬性爲 TimeClip(UTC(finalDate))。


new Date (value)

新構造對象的 [[Prototype]] 內部屬性設定爲原始的時間原型對象,它是 Date.prototype 的初始值。

新構造對象的 [[Class]] 內部屬性設定爲 "Date"

新構造對象的 [[Extensible]] 內部屬性設定爲 ture

新構造對象的 [[PrimitiveValue]] 內部屬性按照以下步驟設定:

  1. v ToPrimitive(value)。
  2. 如果 Type(v) 是 String,則
    1. 用與 parse 方法 (15.9.4.2) 完全相同的方式將 v 解析爲一個日期時間;令 V 爲這個日期時間的時間值。
  3. 否則,令 V ToNumber(v)。
  4. 設定新構造對象的 [[PrimitiveValue]] 內部屬性爲 TimeClip(V),並返回這個值。


new Date ( )

新構造對象的 [[Prototype]] 內部屬性設定爲原始的時間原型對象,它是 Date.prototype 的初始值。

新構造對象的 [[Class]] 內部屬性設定爲 "Date"

新構造對象的 [[Extensible]] 內部屬性設定爲 ture

新構造對象的 [[PrimitiveValue]] 內部屬性設定爲表示當前時間的時間值(協調世界時)。


Date 構造器的屬性

Date 構造器的 [[Prototype]] 內部屬性的值是 Function 原型對象

除了內部屬性和 length 屬性 ( 值爲 7 ) 之外,Date 構造器還有以下屬性:


Date.prototype

Date.prototype 的初始值是內置的 Date 原型對象V8.png

此屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Date.parse (string)

parse 函數對它的參數應用 ToString 操作並將結果字符串解釋爲一個日期和時間;返回一個數字值,是對應這個日期時間的 UTC 時間值。字符串可解釋爲本地時間,UTC 時間,或某個其他時區的時間,這取決於字符串裏的內容。此函數首先嚐試根據日期時間字符串格式(15.9.1.15)裏的規則來解析字符串的格式。如果字符串不符合這個格式此函數可回退,用任意實現定義的試探方式或日期格式。無法識別的字符串或日期時間包含非法元素值,將導致 Date.parse 返回 NaNV8.png

在所有屬性都指向它們的初始值的情況下,如果 x 是一個在特定 ECMAScript 的實現裏的毫秒數爲零的任意 Date 對象,則在這個實現中以下所有表達式應產生相同數字值:

 x.valueOf()
 Date.parse(x.toString())
 Date.parse(x.toUTCString())
 Date.parse(x.toISOString())

然而,表達式

 Date.parse( x.toLocaleString())

是不需要產生與前面三個表達參數相同的數字值。通常,在給定的字符串不符合日期時間字符串格式(15.9.1.15)時,Date.parse 的產生值是依賴於實現,並且在同一實現中 toStringtoUTCString 方法不能產生不符合日期時間字符串格式的字符串。


Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ])

當用少於兩個的參數調用 UTC 函數時,它的行爲是依賴於實現的。當用二到七個參數調用 UTC 函數,它從 yearmonth 和(可選的)datehoursminutessecondsms 計算出日期時間。採用以下步驟:V8.png

  1. y ToNumber(year)。
  2. m ToNumber(month)。
  3. 如果提供了 date,則令 dt ToNumber(date);否則令 dt1
  4. 如果提供了 hours,則令 h ToNumber(hours);否則令 h0
  5. 如果提供了 minutes,則令 min ToNumber(minutes);否則令 min0
  6. 如果提供了 seconds,則令 s ToNumber(seconds);;否則令 s0
  7. 如果提供了 ms,則令 milli ToNumber(ms);否則令 milli0
  8. 如果 y 不是 NaN0 ToInteger(y) ≤ 99,則令 yr1900 + ToInteger(y);否則令 yry
  9. 返回 TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))。

UTC 函數的 length 屬性是 7


注: UTC 函數與 Date 構造器的不同點有:它返回一個時間值,而不是創建 Date 對象,還有它將參數解釋爲 UTC,而不是本地時間。

Date.now ( )

now 函數返回一個數字值,它表示調用 now 時的 UTC 日期時間的時間值。V8.png


Date 原型對象的屬性

Date 原型對象自身是一個 Date 對象(其 [[Class]]"Date"),其 [[PrimitiveValue]]NaN Ms.png

Date 原型對象的 [[Prototype]] 內部屬性的值是標準內置 Object 原型對象

在以下對 Date 原型對象的函數屬性的描述中,短語“this Date 對象”指調用函數時的 this 值對象。除非另外說明,這些函數不是通用的;如果 this 值不是 [[Class]] 內部屬性爲 "Date" 的對象,則拋出一個 TypeError 異常。短語“this 時間值”指代表 this Date 對象 的時間值的數字值,它是 this Date 對象 [[PrimitiveValue]] 內部屬性的值。


Date.prototype.constructor

Date.prototype.constructor 的初始值是內置 Date 構造器。V8.png


Date.prototype.toString ( )

此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區的時間。V8.png

注: 對毫秒數爲零的任意 DatedDate.parse(d.toString())d.valueOf() 的結果相同。見 15.9.4.2

Date.prototype.toDateString ( )

此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區時間的“日期”部分。V8.png


Date.prototype.toTimeString ( )

此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區時間的“時間”部分。V8.png


Date.prototype.toLocaleString ( )

這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date。V8.png

注: 這個函數的第一個參數可能會在此標準的未來版本中使用到;因此建議實現不要以任何目的使用這個位置參數。


Date.prototype.toLocaleDateString ( )

這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date 的日期部分。V8.png

注: 這個函數的第一個參數可能會在此標準的未來版本中使用到;因此建議實現不要以任何目的使用這個位置參數。


Date.prototype.toLocaleTimeString ( )

這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date 的時間部分。V8.png

注: 這個函數的第一個參數可能會在此標準的未來版本中使用到;因此建議實現不要以任何目的使用這個位置參數。


Date.prototype.valueOf ( )

valueOf 函數返回一個數字值,它是 this 時間值V8.png


Date.prototype.getTime ( )

  1. 返回 this 時間值V8.png


Date.prototype.getFullYear ( ) Note.png

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 YearFromTime(LocalTime(t))。


Date.prototype.getUTCFullYear ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 YearFromTime(t)。


Date.prototype.getMonth ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 MonthFromTime(LocalTime(t))。


Date.prototype.getUTCMonth ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 MonthFromTime(t)。


Date.prototype.getDate ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 DateFromTime(LocalTime(t))。


Date.prototype.getUTCDate ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 DateFromTime(t)。


Date.prototype.getDay ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 WeekDay(LocalTime(t))。


Date.prototype.getUTCDay ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 WeekDay(t)。


Date.prototype.getHours ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 HourFromTime(LocalTime(t))。


Date.prototype.getUTCHours ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 HourFromTime(t)。


Date.prototype.getMinutes ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 MinFromTime(LocalTime(t))。


Date.prototype.getUTCMinutes ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 MinFromTime(t)。


Date.prototype.getSeconds ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 SecFromTime(LocalTime(t))。


Date.prototype.getUTCSeconds ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 SecFromTime(t)。


Date.prototype.getMilliseconds ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 msFromTime(LocalTime(t))。


Date.prototype.getUTCMilliseconds ( )

  1. tthis 時間值V8.png
  2. 如果 tNaN,返回 NaN
  3. 返回 msFromTime(t)。


Date.prototype.getTimezoneOffset ( )

返回本地時間和 UTC 時間之間相差的分鐘數。V8.png

  1. tthis 時間值
  2. 如果 tNaN,返回 NaN
  3. 返回 ( t - LocalTime(t) ) / msPerMinute )。


Date.prototype.setTime (time)

  1. v TimeClip(ToNumber(time))。V8.png
  2. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  3. 返回 v


Date.prototype.setMilliseconds (ms)

  1. t LocalTime(this 時間值) 的結果。V8.png
  2. time MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms))。
  3. u TimeClip(UTC(MakeDate(Day(t), time)))。
  4. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  5. 返回 u


Date.prototype.setUTCMilliseconds (ms)

  1. tthis 時間值V8.png
  2. time MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms))。
  3. v TimeClip(MakeDate(Day(t), time))。
  4. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  5. 返回 v


Date.prototype.setSeconds (sec [, ms ] )

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。V8.png

  1. t LocalTime( this 時間值 ) 的結果。
  2. s ToNumber(sec)。
  3. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli ToNumber(ms)。
  4. date MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
  5. u TimeClip(UTC(date))。
  6. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  7. 返回 u

setSeconds 方法的 length 屬性是 2


Date.prototype.setUTCSeconds (sec [, ms ] )

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。V8.png

  1. tthis 時間值
  2. s ToNumber(sec)。
  3. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
  4. date MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
  5. v TimeClip(date)。
  6. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  7. 返回 v

setUTCSeconds 方法的 length 屬性是 2


Date.prototype.setMinutes (min [, sec [, ms ] ] )

沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getSeconds() 的結果一樣。V8.png

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。

  1. t LocalTime( this 時間值 ) 的結果。
  2. m ToNumber(min)。
  3. 如果沒指定 sec,則令 s SecFromTime(t);否則,令 s ToNumber(sec)。
  4. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli ToNumber(ms)。
  5. date MakeDate(Day(t),MakeTime(HourFromTime(t), m, s, milli))。
  6. u TimeClip(UTC(date))。
  7. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  8. 返回 u

setMinutes 方法的 length 屬性是 3


Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )

沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getUTCSeconds() 的結果一樣。V8.png

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。

  1. tthis 時間值
  2. m ToNumber(min)。
  3. 如果沒指定 sec,則令 s SecFromTime(t);否則,令 s ToNumber(sec)。
  4. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli ToNumber(ms)。
  5. date MakeDate(Day(t),MakeTime(HourFromTime(t), m, s, milli))。
  6. v TimeClip(date)。
  7. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  8. 返回 v

setUTCMinutes 方法的 length 屬性是 3


Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )

沒指定 min 參數時的行爲是,彷彿 min 被指定爲調用 getMinutes() 的結果一樣。V8.png

沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getSeconds() 的結果一樣。

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。

  1. t LocalTime( this 時間值 ) 的結果。
  2. h ToNumber(hour)。
  3. 如果沒指定 min,則令 m MinFromTime(t);否則,令 m ToNumber(min)。
  4. 如果沒指定 sec,則令 s SecFromTime(t);否則,令 s ToNumber(sec)。
  5. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli ToNumber(ms)。
  6. date MakeDate(Day(t), MakeTime(h, m, s, milli))。
  7. u TimeClip(UTC(date))。
  8. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  9. 返回 u

setHours 方法的 length 屬性是 4


Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )

沒指定 min 參數時的行爲是,彷彿 min 被指定爲調用 getUTCMinutes() 的結果一樣。V8.png

沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getUTCSeconds() 的結果一樣。

沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。

  1. tthis 時間值
  2. h ToNumber(hour)。
  3. 如果沒指定 min,則令 m MinFromTime(t);否則,令 m ToNumber(min)。
  4. 如果沒指定 sec,則令 s SecFromTime(t);否則,令 s ToNumber(sec)。
  5. 如果沒指定 ms,則令 milli msFromTime(t);否則,令 milli ToNumber(ms)。
  6. date MakeDate(Day(t), MakeTime(h, m, s, milli))。
  7. v TimeClip(date)。
  8. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  9. 返回 v

setUTCHours 方法的 length 屬性是 4


Date.prototype.setDate (date)

  1. t LocalTime( this 時間值 ) 的結果。V8.png
  2. dt ToNumber(date)。
  3. newDate MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
  4. u TimeClip(UTC(newDate))。
  5. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  6. 返回 u


Date.prototype.setUTCDate (date)

  1. tthis 時間值V8.png
  2. dt ToNumber(date)。
  3. newDate MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
  4. v TimeClip(newDate)。
  5. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  6. 返回 v


Date.prototype.setMonth (month [, date ] )

沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getDate() 的結果一樣。V8.png

  1. t LocalTime( this 時間值 ) 的結果。
  2. m ToNumber(month)。
  3. 如果沒指定 date,則令 dt DateFromTime(t);否則,令 dt ToNumber(date)。
  4. newDate MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
  5. u TimeClip(UTC(newDate))。
  6. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  7. 返回 u

setMonth 方法的 length 屬性是 2


Date.prototype.setUTCMonth (month [, date ] )

沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getUTCDate() 的結果一樣。V8.png

  1. tthis 時間值
  2. m ToNumber(month)。
  3. 如果沒指定 date,則令 dt DateFromTime(t);否則,令 dt ToNumber(date)。
  4. newDate MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
  5. v TimeClip(newDate)。
  6. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  7. 返回 v

setUTCMonth 方法的 length 屬性是 2


Date.prototype.setFullYear (year [, month [, date ] ] ) Note.png

沒指定 month 參數時的行爲是,彷彿 month 被指定爲調用 getMonth() 的結果一樣。V8.png

沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getDate() 的結果一樣。

  1. t LocalTime( this 時間值 ) 的結果;但如果 this 時間值 NaN,則令 t+0
  2. y ToNumber(year)。
  3. 如果沒指定 month,則令 m MonthFromTime(t);否則,令 m ToNumber(month)。
  4. 如果沒指定 date,則令 dt DateFromTime(t);否則,令 dt ToNumber(date)。
  5. newDate MakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
  6. u TimeClip(UTC(newDate))。
  7. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 u
  8. 返回 u

setFullYear 方法的 length 屬性是 3


Date.prototype.setUTCFullYear (year [, month [, date ] ] )

沒指定 month 參數時的行爲是,彷彿 month 被指定爲調用 getUTCMonth() 的結果一樣。V8.png

沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getUTCDate() 的結果一樣。

  1. tthis 時間值;但如果 this 時間值 NaN,則令 t+0
  2. y ToNumber(year)。
  3. 如果沒指定 month,則令 m MonthFromTime(t);否則,令 m ToNumber(month)。
  4. 如果沒指定 date,則令 dt DateFromTime(t);否則,令 dt ToNumber(date)。
  5. newDate MakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
  6. v TimeClip(newDate)。
  7. 設定 this Date 對象 [[PrimitiveValue]] 內部屬性爲 v
  8. 返回 v

setUTCFullYear 方法的 length 屬性是 3


Date.prototype.toUTCString ( ) Note.png

此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示 UTC 時間。V8.png

注: 此函數的目的是爲日期時間產生一個比 15.9.1.15 指定的格式更易讀的字符串表示。沒必要選擇明確的或易於機器解析的格式。如果一個實現沒有一個首選的人類可讀格式,建議使用 15.9.1.15 定義的格式,但用空格而不是“T”分割日期和時間元素。


Date.prototype.toISOString ( )

此函數返回一個代表 this Date 對象表示的時間實例 的字符串。字符串的格式是 15.9.1.15 定義的日期時間字符串格式。字符串中包含所有的字段。字符串表示的時區總是 UTC,用後綴 Z 標記。如果 this 對象的時間值不是有限的數字值,拋出一個 RangeError 異常。V8.png


Date.prototype.toJSON ( key )

此函數爲 JSON.stringify (15.12.3) 提供 Date 對象的一個字符串表示。V8.png

當用參數 key 調用 toJSON 方法,採用以下步驟:

  1. O 爲 以 this 值爲參數調用 ToObject 的結果。
  2. tv ToPrimitive(O, 暗示 Number)。
  3. 如果 tv 是一個數字值且不是有限的,返回 null
  4. toISO 爲以 "toISOString" 爲參數調用 O [[Get]] 內部方法的結果。
  5. 如果 IsCallable(toISO) 是 false,拋出一個 TypeError 異常。
  6. O 作爲以 this 值並用空參數列表調用 toISO [[Call]] 內部方法,返回結果。
注: 參數是被忽略的。Question.png
注: toJSON 函數是故意設計成通用的;它不需要其 this 值必須是一個 Date 對象。因此,它可以作爲方法轉移到其他類型的對象上。但轉移到的對象必須有 toISOString 方法。對象可自由使用參數 key 來過濾字符串化的方式。


Date 實例的屬性

Date 實例從 Date 原型對象繼承屬性,Date 實例的 [[Class]] 內部屬性值是 "Date"Date 實例還有一個 [[PrimitiveValue]] 內部屬性。

[[PrimitiveValue]] 內部屬性是代表 this Date 對象 的時間值。


RegExp 對象

一個 RegExp 對象包含一個正則表達式和關聯的標誌。

注: 正則表達式的格式和功能是以 Perl 5 程序語言的正則表達式設施爲藍本的。


模式(Patterns)

RegExp 構造器對輸入模式字符串應用以下文法。如果文法無法將字符串解釋爲 Pattern 的一個展開形式,則發生錯誤。

語法:

 Pattern :: V8.png
   Disjunction
 Disjunction :: V8.png
   Alternative
   Alternative | Disjunction V8.png
 Alternative :: 
   [empty]
   Alternative Term
 Term ::
   Assertion
   Atom
   Atom Quantifier
 Assertion ::
   ^ V8.png
   $ V8.png
   \ b V8.png
   \ B V8.png
   ( ? = Disjunction ) V8.png
   ( ? ! Disjunction ) V8.png
 Quantifier ::
   QuantifierPrefix
   QuantifierPrefix ? V8.png
 QuantifierPrefix ::
   * V8.png
   + V8.png
   ? V8.png
   { DecimalDigits } V8.png
   { DecimalDigits , } V8.png
   { DecimalDigits , DecimalDigits } V8.png
 Atom ::
   PatternCharacter
   . V8.png
   \ AtomEscape
   CharacterClass V8.png
   ( Disjunction ) V8.png
   ( ? : Disjunction ) V8.png
 PatternCharacter ::
   SourceCharacter but not one of
   ^ $ \ . * + ? ( ) [ ] { } |
 AtomEscape ::
   DecimalEscape V8.png
   CharacterEscap
   CharacterClassEscape V8.png
 CharacterEscape ::
   ControlEscape
   c ControlLetter V8.png
   HexEscapeSequence V8.png
   UnicodeEscapeSequence V8.png
   IdentityEscape V8.png
 ControlEscape :: one of
   f n r t v V8.png V8.png
 ControlLetter :: 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
 IdentityEscape ::
   SourceCharacter but not IdentifierPart
   <ZWJ>
   <ZWNJ>
 DecimalEscape ::
   DecimalIntegerLiteral [lookahead ∉ DecimalDigit]
 CharacterClassEscape :: one of
   d D s S w W V8.png
 CharacterClass :: V8.png
   [ [lookahead ∉ {^}] ClassRanges ]
   [ ^ ClassRanges ] V8.png
 ClassRanges ::
   [empty]
   NonemptyClassRanges
 NonemptyClassRanges ::
   ClassAtom
   ClassAtom NonemptyClassRangesNoDash
   ClassAtom - ClassAtom ClassRanges V8.png
 NonemptyClassRangesNoDash ::
   ClassAtom
   ClassAtomNoDash NonemptyClassRangesNoDash
   ClassAtomNoDash - ClassAtom ClassRanges
 ClassAtom ::
   -
   ClassAtomNoDash
 ClassAtomNoDash :: V8.png
   SourceCharacter but not \]- 
   \ ClassEscape
 ClassEscape ::
   DecimalEscape
   b V8.png
   CharacterEscap
   CharacterClassEscape


模式語義(Pattern Semantics)

使用下面描述的過程來將一個正則表達式模式轉換爲一個內部程序。實現使用比下面列出的算法跟高效的算法是被鼓勵的,只要結果是相同的。內部程序用作 RegExp 對象的 [[Match]] 內部屬性的值。


表示法(Notation)

後面的描述用到以下變量:

  • Input,是正則表達式模式要匹配的字符串。符號 Input[n] 表示 Input 的第 n 個字符,這裏的 n 可以是 0(包括)和 InputLength(不包括)之間的。
  • InputLength,是 Input 字符串裏的字符數目。
  • NcapturingParens,是在模式中左捕獲括號的總數(即,Atom :: ( Disjunction ) 產生式被展開的總次數)。一個左捕獲括號是匹配產生式 Atom :: ( Disjunction ) 中的 終結符 ( 的任意 ( 模式字符。
  • IgnoreCase,是 RegExp 對象的 ignoreCase 屬性的設定值。
  • Multiline,是 RegExp 對象的 multiline 屬性的設定值。

此外,後面的描述用到以下內部數據結構:

  • CharSet,是字符的一個數學上的集合。
  • State,是一個有序對 (endIndex, captures) ,這裏 endIndex 是一個整數,captures 是有 NcapturingParens 個值的內部數組。 State 用來表示正則表達式匹配算法裏的局部匹配狀態。endIndex 是到目前爲止模式匹配的最後一個輸入字符的索引值加上一,而 captures 持有捕獲括號的捕獲結果。captures 的第 n 個元素是一個代表第 n 個捕獲括號對捕獲值的字符串,或如果第 n 個捕獲括號對未能達到目的,captures 的第 n 個元素是 undefined。由於回溯,很多 State 可能在匹配過程中的任何時候被使用。
  • MatchResult,值爲 State 或表示匹配失敗特殊記號 failure
  • Continuation 程序,是一個內部閉包(即,一些參數已經綁定了值的內部程序),它用一個 State 參數返回一個 MatchResult 結果。 如果一個內部閉包引用的變量是綁定在創建這個閉包的函數裏 , 則閉包使用在創建閉包時的這些變量值。Continuation 嘗試從其 State 參數給定的中間狀態開始用模式的其餘部分(由閉包的已綁定參數指定)匹配輸入字符串。如果匹配成功,Continuation 返回最終的 State;如果匹配失敗,Continuation 返回 failure
  • Matcher 程序,是一個需要兩個參數:State Continuation,的內部閉包,它返回一個 MatchResult 結果。 Matcher 嘗試從其 State 參數給定的中間狀態開始用模式的一箇中間子模式(由閉包的已綁定參數指定)匹配輸入字符串。Continuation 參數是去匹配模式中剩餘部分的閉包。用模式的子模式匹配之後獲得一個新 State,之後 Matcher 用新 State 去調用 Continuation 來測試模式的剩餘部分是否能匹配成功。如果匹配成功,Matcher 返回 Continuation 返回的 State;如果匹配失敗,Matcher 嘗試用不同的可選位置重複調用 Continuation,直到 Continuation 匹配成功或用盡所有的可選位置。
  • AssertionTester 程序,是需要一個 State 參數並返回一個布爾結果的內部閉包。 AssertionTester 測試輸入字符串的當前位置是否滿足一個特定條件 ( 由閉包的已綁定參數指定 ) ,如果匹配了條件,返回 true;如果不匹配,返回 false
  • EscapeValue,是一個字符或一個整數。EscapeValue 用來表示 DecimalEscape 轉移序列的解釋結果:一個字符 ch 在轉義序列裏時,它被解釋爲字符 ch;而一個整數 n 在轉義序列裏時,它被解釋爲對第 n 個捕獲括號組的反響引用。


模式(Pattern

產生式 Pattern :: Disjunction 按照以下方式解釋執行 :

  1. 解釋執行 Disjunction ,獲得一個 Matcher m
  2. 返回一個需要兩個參數的內部閉包,一個字符串 str 和一個整數 index,執行方式如下:
    1. Input 爲給定的字符串 str15.10.2 中的算法都將用到此變量。
    2. InputLength Input 的長度。15.10.2 中的算法都將用到此變量。
    3. c 爲 一個 Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult
    4. cap 爲一個有 NcapturingParensundefined 值的內部數組,索引是從 1 NcapturingParens
    5. x State(index, cap)。
    6. 調用 m(x, c),並返回結果。
注: 一個模式解釋執行(“編譯”)爲一個內部程序值。RegExp.prototype.exec 可將這個內部程序應用於一個字符串和字符串的一個偏移位,來確定從這個偏移位開始 , 模式是否能夠匹配,如果能匹配,將返回捕獲括號的值。15.10.2 中的算法被設計爲只在編譯一個模式時可拋出一個 SyntaxError 異常;反過來說,一旦模式編譯成功,應用編譯生成的內部程序在字符串中尋找匹配結果時不可拋出異常(除非是宿主定義的可在任何時候出現的異常,如內存不足)。


析取(Disjunction

產生式 Disjunction :: Alternative 的解釋執行,是解釋執行 Alternative 來獲得 Matcher 並返回這個 Matcher

產生式 Disjunction :: Alternative | Disjunction 按照以下方式解釋執行:

  1. 解釋執行 Alternative 來獲得一個 Matcher m1
  2. 解釋執行 Disjunction 來獲得一個 Matcher m2
  3. 返回一個需要兩個參數的內部閉包 Matcher,參數分別是一個 State x 和一個 Continuation c,此內部閉包的執行方式如下:
    1. 調用 m1(x, c) 並令 r 爲其結果。
    2. 如果 r 不是 failure,返回 r
    3. 調用 m2(x, c) 並返回其結果。


注: 正則表達式運算符 | 用來分隔兩個選擇項。模式首先嚐試去匹配左側的 Alternative(緊跟着是正則表達式的後續匹配結果);如果失敗,嘗試匹配右側的 Disjunction(緊跟着是正則表達式的後續匹配結果)。如果左側的 Alternative,右側的 Disjunction,還有後續匹配結果,全都有可選的匹配位置,則後續匹配結果的所有可選位置是在左側的 Alternative 移動到下一個可選位置之前確定的。如果左側 Alternative 的可選位置被用盡了,右側 Disjunction 試圖替代左側 Alternative。一個模式中任何被 | 跳過的捕獲括號參數 undefined 值還代替字符串。因此,如:
 /a|ab/.exec("abc")

返回結果是 "a",而不是 "ab"。此外

 /((a)|(ab))((c)|(bc))/.exec("abc")

返回的數組是

 ["abc", "a", "a", undefined, "bc", undefined, "bc"]

而不是

 ["abc", "ab", undefined, "ab", "c", "c", undefined]


選擇項(Alternative

產生式 Alternative :: [empty] 解釋執行返回一個 Matcher,它需要兩個參數,一個 State x 和 一個 Continuation c,並返回調用 c(x) 的結果。

產生式 Alternative :: Alternative Term 按照如下方式解釋執行:

  1. 解釋執行 Alternative 來獲得一個 Matcher m1
  2. 解釋執行 Term 來獲得一個 Matcher m2
  3. 返回一個內部閉包 Matcher,它需要兩個參數,一個 State x 和一個 Continuation c,執行方式如下 :
    1. 創建一個 Continuation d,它需要一個 State 參數 y,返回調用 m2(yc) 的結果。
    2. 調用 m1(x, d) 並返回結果。
注: 連續的 Term 試着同時去匹配連續輸入字符串的連續部分。如果左側的 Alternative ,右側的 Term ,還有後續匹配結果,全都有可選的匹配位置,則後續匹配結果的所有可選位置是在右側的 Term 移動到下一個可選位置之前確定的,並且則右側的 Term 的所有可選位置是在左側的 Alternative 移動到下一個可選位置之前確定的。


匹配項(Term

產生式 Term :: Assertion 解釋執行,返回一個需要兩個參數 State x Continuation c 的內部閉包 Matcher,它的執行方式如下:

  1. 解釋執行 Assertion 來獲得一個 AssertionTester t
  2. 調用 t(x) 並令 r 爲調用結果布爾值。
  3. 如果 rfalse,返回 failure
  4. 調用 c(x) 並返回結果。

產生式 Term :: Atom 的解釋執行方式是,解釋執行 Atom 來獲得一個 Matcher 並返回這個 Matcher

產生式 Term :: Atom Quantifier 的解釋執行方式如下 :

  1. 解釋執行 Atom 來獲得一個 Matcher m
  2. 解釋執行 Quantifier 來獲得三個結果值:一個整數 min,一個整數(或 max,和一個布爾值 greedy
  3. 如果 max 是有限的 且小於 min,則拋出一個 SyntaxError 異常。
  4. parenIndex 爲整個正則表達式中在此產生式 Term 展開形式左側出現的左匹配括號的數目。這是此產生式 Term 前面展開的 Atom :: ( Disjunction ) 產生式總數與此 Term 裏面的 Atom :: ( Disjunction ) 產生式總數之和。
  5. parenCount 爲在展開的 Atom 產生式裏的左捕獲括號數目。這是 Atom 產生式裏面 Atom :: ( Disjunction ) 產生式的總數。
  6. 返回一個需要兩個參數 State x Continuation c 的內部閉包 Matcher,執行方式如下:
    1. 調用 RepeatMatcher(m, min, max, greedy, x, c, parenIndex, parenCount),並返回結果。

抽象操作 RepeatMatcher 需要八個參數,一個 Matcher m,一個整數 min,一個整數(或 max,一個布爾值 greedy,一個 State x,一個 Continuation c,一個整數 parenIndex,一個整數 parenCount,執行方式如下:

  1. 如果 max 是零,則調用 c(x),並返回結果。
  2. 創建需要一個 State 參數 y 的內部 Continuation 閉包 d,執行方式如下:
    1. 如果 min 是零 且 yendIndex 等於 x endIndex,則返回 failure
    2. 如果 min 是零,則令 min2 爲零;否則令 min2min-1
    3. 如果 max,則令 max2;否則令 max2max-1
    4. 調用 RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount),並返回結果。
  3. capx 的捕獲內部數組的一個拷貝。
  4. 對所有滿足條件 parenIndex < kkparenIndex+parenCount 的整數 k,設定 cap[k] 爲 undefined
  5. exendIndex
  6. xr State 值 (e, cap)。
  7. 如果 min 不是零,則調用 m(xr, d),並返回結果。
  8. 如果 greedyfalse,則
    1. z 爲調用 c(x) 的結果。
    2. 如果 z 不是 failure,返回 z
    3. 調用 m(xr, d),並返回結果。
  9. z 爲調用 m(xr, d) 的結果。
  10. 如果 z 不是 failure,返回 z
  11. 調用 c(x),並返回結果。


斷言(Assertion

產生式 Assertion :: ^ 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:

  1. 使 exendIndex
  2. e = 0,返回 true
  3. Multilinefalse,返回 false
  4. Input[e - 1] 的字符爲 LineTerminator,返回 true
  5. 返回 false

產生式 Assertion :: $ 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:

  1. 使 exendIndex
  2. e = InputLength,返回 true
  3. Multilinefalse,返回 false
  4. Input[e] 的字符爲 LineTerminator,返回 true
  5. 返回 false

產生式 Assertion :: \ b 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:

  1. 使 exendIndex
  2. 調用 IsWordChar(e - 1),返回 Boolean 值賦給 a
  3. 調用 IsWordChar(e),返回 Boolean 值賦給 b
  4. atruebfalse,返回 true
  5. afalsebtrue,返回 true
  6. 返回 false

產生式 Assertion :: \ B 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:

  1. 使 exendIndex
  2. 調用 IsWordChar(e - 1),返回 Boolean 值賦給 a
  3. 調用 IsWordChar(e),返回 Boolean 值賦給 b
  4. atruebfalse,返回 false
  5. afalsebtrue,返回 false
  6. 返回 true

產生式 Assertion :: (? = Disjunction ) 按如下算法執行:

  1. 執行 Disjunction,得到 Matcher m
  2. 返回一個需要兩個參數的內部閉包 Matcher,參數分別是一個 State x 和一個 Continuation c,此內部閉包的執行方式如下:
    1. 使 d 爲一個Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult
    2. 調用 m(x, d),令 r 爲其結果。
    3. rfailure,返回 failure
    4. 使 yr State
    5. 使 caprcaptures
    6. 使 xerendIndex
    7. 使 z State (xe, cap)。
    8. 調用 c(z),返回結果。

產生式 Assertion :: (? ! Disjunction ) 按如下算法執行:

  1. 執行 Disjunction,得到 Matcher m
  2. 返回一個需要兩個參數的內部閉包 Matcher,參數分別是一個 State x 和一個 Continuation c,此內部閉包的執行方式如下:
    1. 使 d 爲一個 Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult
    2. 調用 m(x, d),令 r 爲其結果。
    3. 若r爲failure,返回 failure
    4. 調用 c(z),返回結果。

抽象操作 IsWordChar,擁有一個整數類型的參數 e,按如下方式執行:Note.png

  1. e == -1e == InputLength,返回 false
  2. c Input[e]。
  3. c 爲 以下63個字符,返回 true
    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
    0 1 2 3 4 5 6 7 8 9 _
  4. 返回 false


量詞(Quantifier

產生式 Quantifier :: QuantifierPrefix 按如下方式執行:

  1. 執行 QuantifierPrefix 得到 2 個數 minmax(或 )。
  2. 返回 minmaxtrue

產生式 Quantifier :: QuantifierPrefix ? 按如下方式執行:

  1. 執行 QuantifierPrefix 得到 2 個數 minmax(或 )。
  2. 返回 minmaxfalse

產生式 Quantifier :: * 返回 0

產生式 Quantifier :: + 返回 1

產生式 Quantifier :: ? 返回 01

產生式 Quantifier :: { DecimalDigits } 按如下方式執行:

  1. iDecimalDigits 的數學值。
  2. 返回 ii

產生式 Quantifier :: { DecimalDigits , } 按如下方式執行:

  1. iDecimalDigits 的數學值。
  2. 返回 i

產生式 Quantifier :: { DecimalDigits , DecimalDigits } 按如下方式執行:

  1. iDecimalDigits 的數學值。
  2. jDecimalDigits 的數學值。
  3. 返回 ij


原子(Atom

產生式 Atom :: PatternCharacter 執行方式如下:

  1. chPatternCharacter 表示的字符。
  2. A 爲單元素 CharSet,包含 ch
  3. 調用 CharacterSetMatcher(A, false),返回 Matcher

產生式 Atom :: . 執行方式如下

  1. A 爲 除去 LineTerminator 外的所有字符。
  2. 調用 CharacterSetMatcher(A, false),返回 Matcher

產生式 Atom :: \ AtomEscape 通過執行 AtomEscape 返回 Matcher

產生式 Atom :: CharacterClass 執行方式如下:

  1. 執行 CharacterClass 得到 CharSet ABoolean invert
  2. 調用 CharacterSetMatcher(A, false),返回 Matcher

產生式 Atom :: ( Disjunction ) 執行方式如下:

  1. 執行 Disjunction 得到 Matcher
  2. parenIndex 爲 在整個正則表達式中從產生式展開初始化左括號時,當前展開左捕獲括號的索引。parenIndex 爲在產生式的 Atom 被展開之前,Atom :: ( Disjunction ) 產生式被展開的次數,加上 Atom :: ( Disjunction ) 閉合 這個 Atom 的次數。
  3. 返回一個內部閉包 Matcher,擁有2個參數:一個 State x Continuation c,執行方式如下:
    1. 創建內容閉包 Continuation d,參數爲State y,並按如下方式執行:
      1. capycapture 數組的一個拷貝。
      2. xe 爲 x 的 endIndex
      3. yeyendIndex
      4. s Input 從索引 xe(包括)至 ye(不包括)範圍的新創建的字符串。
      5. scap[parenIndex + 1]。
      6. z State (ye, cap)。
      7. 調用 c(z),返回其結果。
    2. 執行 m(x, d),返回其結果。

產生式 Atom :: ( ? : Disjunction ) 通過執行 Disjunction 得到並返回一個 Matcher

抽象操作 CharacterSetMatcher,擁有2個參數:一個 CharSet ABoolean invert 標誌,按如下方式執行:

  1. 返回一個內部閉包 Matcher,擁有2個參數:一個 State x Continuation c,執行方式如下:
    1. exendIndex
    2. e == InputLength,返回 failure
    3. ch 爲字符Input[e]。
    4. cc Canonicalize(ch) 的結果。
    5. invertfalse,如果 A 中不存在 a 使得 Canonicalize(a) == cc,返回failure
    6. inverttrue,如果 A 中存在 a 使得 Canonicalize(a) == cc,返回failure
    7. capx 的內部 captures 數組。
    8. y State (e + 1, cap)。
    9. 調用 c(y),返回結果。

抽象操作 Canonicalize,擁有一個字符參數 ch,按如下方式執行:

  1. IgnoreCasefalse,返回 ch
  2. uch 轉換爲大寫後的結果,彷彿通過調用標準內置方法 String.prototype.toUpperCase
  3. u 不含單個字符,返回 ch
  4. cuu 的字符。
  5. ch 的單位代碼值 >= 128cu 的單位代碼值 <= 128,返回ch
  6. 返回 cu
注: ( Disjunction ) 的括號 用來組合 Disjunction 模式,並保存匹配結果。該結果可以通過後向引用(一個非零數,前置 \ ),在一個替換字符串中的引用,或者作爲正則表達式內部匹配過程的部分結果。使用(?: Disjunction )來避免括號的捕獲行爲。

例如,

 /(?=(a+))/.exec("baaabac")

會匹配第一個b後的空白字符串,得到:

 ["", "aaa"]

爲了說明預查不會回溯,

 /(?=(a+))a*b\1/.exec("baaabac")

得到:

 ["aba", "a"]

而不是:

 ["aaaba", "a"]
注: (?! Disjunction ) 指定一個零寬正向否定預查。爲了保證匹配成功,其 Disjunction 必須首先能夠匹配失敗,但在匹配後續字符前,其當前位置會不變。Disjunction 能含有捕獲括號,但是對這些捕獲分組的後向引用只在 Disjunction 中有效。在當前模式的其他位置後向引用捕獲分組都會返回 undefined。因爲否定預查必須滿足預查失敗來保證模式成功匹配。
注: (? = Disjunction ) 指定一個零寬正向預查。爲了保證匹配成功,其 Disjunction 必須首先能夠匹配成功,但在匹配後續字符前,其當前位置會不變。如果 Disjunction 能在當前位置以多種方式匹配,那麼只會取第一次匹配的結果。不像其他正則表達式運算符,(?= 內部不會回溯(這個特殊的行爲是從 Perl 繼承過來的)。在 Disjunction 含有捕獲括號,模式的後續字符包括後向引用時匹配結果會有影響。

例如,

 /(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

搜索 a,其後有 na,一個 bna\2 指定)和一個 c。第二個 \2 位於負向預查模式的外部,因此它匹配 undefined,且總是成功的。整個表達式返回一個數組:

 ["baaabaac", "ba", undefined, "abaac"]

在大小寫不敏感的匹配中,所有字符都在它們參與比較之前隱式轉換成大寫的。然而,如果把一個字符轉換成大寫會產生多個字符(例如 "ß"\u00DF) 轉換到 "SS"),那麼字符將保持不變。如果一個字符是非 ASCII 字符,但卻會因大小寫轉換而變成 ASCII 字符,那麼在匹配中它也會保持不變。這個規定阻止了一些如 \u0131\u017F 之類的 Unicode 字符 Note.png/[a-z]/i 這樣的正則表達式匹配,這樣的正則表達式被故意設計成只匹配 ASCII 字符。此外,倘若從 Unicode 到 ASCII 的轉換被允許,將會造成 /[^\W]/i 可以匹配 abh,但無法匹配 is


轉義原子(AtomEscape

產生式 AtomEscape :: DecimalEscape 執行方式如下:

  1. 執行 DecimalEscape 得到 EscapeValue E
  2. 如果 E 爲一個字符,
    1. chE 的字符。
    2. A 爲包含 ch 字符的單元素字符集 CharSet
    3. 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。
  3. E 必須是一個數。令 n 爲該數。
  4. 如果 n = 0n > NcapturingParens,拋出 SyntaxError 異常。
  5. 返回一個內部閉包 Matcher,擁有2個參數:一個 State x Continuation c,執行方式如下:
    1. capxcaptures 內部數組。
    2. scap[n]。
    3. 如果 sundefined,調用 c(x),返回結果
    4. exendIndex
    5. lenslength
    6. fe + len
    7. 如果 f > InputLength,返回 failure
    8. 如果存在位於 0(包括)到 len(不包括)的整數 i 使得 Canonicalize(s[i]) 等於 Canonicalize(Input[e + i]),那麼返回failure
    9. yState (f, cap)。
    10. 調用 c(y),返回結果。

產生式 AtomEscape :: CharacterEscap 執行方式如下:

  1. 執行 CharacterEscap 得到一個 ch 字符。
  2. A 爲包含 ch 字符的單元素字符集 CharSet
  3. 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。

產生式 AtomEscape :: CharacterClassEscape 執行方式如下:

  1. 執行 CharacterClassEscape 得到一個CharSet A
  2. 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。
注: 格式 \ 後爲非零數 n 的轉義序列匹配捕獲分組的第 n 次匹配結果。如果正則表達式少於 n 個捕獲括號,會報錯。如果正則表達式大於等於 n 個捕獲括號,由於沒有捕獲到任何東西,導致第 n 個捕獲分組結果爲undefined,那麼後向引用總是成功的。


轉義字符(CharacterEscap

產生式 CharacterEscap :: ControlEscape 執行返回一個根據 表23 定義的字符:

表23 - ControlEscape 的字符值
ControlEscape 單位代碼 名稱 記號
t \u0009 水平製表符 <HT>
n \u000A 換行符 <LF>
v \u000B 垂直製表符 <VT>
f \u000C 換頁符 <FF>
r \u000D 回車符 <CR>

產生式 CharacterEscap :: c ControlLetter 執行過程如下:

  1. ch 爲通過 ControlLetter 表示的字符
  2. ich 的單位代碼值
  3. ji/32 的餘數
  4. 返回 j

產生式 CharacterEscap :: HexEscapeSequence 執行 HexEscapeSequence 的字符值,返回其字符結果。

產生式 CharacterEscap :: UnicodeEscapeSequence 執行 UnicodeEscapeSequence 的字符值,返回其字符結果。

產生式 CharacterEscap :: IdentityEscape 執行返回由 IdentityEscape 表示的字符。


轉義十進制(DecimalEscape

產生式 DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] 按如下方式執行:

  1. iDecimalIntegerLiteral 的字符值
  2. 如果 i0,返回包含一個 <NUL> 字符(Unicode 值爲 0000)的 EscapeValue
  3. 返回包含整數 iEscapeValue

DecimalIntegerLiteral 的數學值在 7.8.3 節定義。

注: 如果 \ 後面是一個數字,且首位爲 0,那麼,該轉義序列被認爲是一個後向引用。如果 n 比在整個正則表達式左捕獲括號個數大,那麼會出錯。\0 表示 <NUL> 字符,其後不能再有數字。


轉義字符類(CharacterClassEscape

產生式 CharacterClassEscape :: d 執行返回包含09之間的十元素字符集。

產生式 CharacterClassEscape :: D 執行返回不包括 CharacterClassEscape :: d 的字符集。

產生式 CharacterClassEscape :: s 執行返回包含 WhiteSpaceLineTerminator 產生式右部分字符的字符集。

產生式 CharacterClassEscape :: S 執行返回不包括 CharacterClassEscape :: s 的字符集。

產生式 CharacterClassEscape :: w 執行返回包含如下63個字符的字符集:

 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
 0 1 2 3 4 5 6 7 8 9 _

產生式 CharacterClassEscape :: W 執行返回不包括 CharacterClassEscape :: w 的字符集。


字符類(CharacterClass

產生式 CharacterClass :: [ [lookahead ∉ {^}] ClassRanges ] 通過執行 ClassRanges 獲得並返回這個 CharSetBoolean false

產生式 CharacterClass :: [ ^ ClassRanges ] 通過執行 ClassRanges 獲得並返回這個 CharSetBoolean true


字符範圍集(ClassRanges

產生式 ClassRanges :: [empty] 執行返回一個空的 CharSet

產生式 ClassRanges :: NonemptyClassRanges 通過執行 NonemptyClassRanges 獲得並返回這個 CharSet


非空字符範圍集(NonemptyClassRanges

產生式 NonemptyClassRanges :: ClassAtom 通過執行 ClassAtom 獲得一個 CharSet 並返回這個CharSet

產生式 NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash 按如下方式執行:

  1. 執行 ClassAtom 得到一個 CharSet A
  2. 執行 NonemptyClassRangesNoDash 得到一個 CharSet B
  3. 返回 AB 的並集。

產生式 NonemptyClassRanges :: ClassAtom - ClassAtom ClassRanges 按如下方式執行:

  1. 執行第一個 ClassAtom 得到一個 CharSet A
  2. 執行第二個 ClassAtom 得到一個 CharSet B
  3. 執行 ClassRanges 得到一個CharSet C
  4. 調用 CharacterRange(A, B),令D爲其結果 CharSet
  5. 返回 DC 的並集。

抽象操作 CharacterRange,擁有2個 CharSet 參數 AB,執行方式如下:

  1. 如果 AB 爲空,拋出 SyntaxError 異常。
  2. a CharSet A 的一個字符。
  3. b CharSet B 的一個字符。
  4. ia 的單位代碼值。
  5. jb 的單位代碼值。
  6. 如果 i > j,拋出 SyntaxError 異常。
  7. 返回位於在 ij(包括邊界)之間的所有字符的字符集。


無連接符非空字符範圍集(NonemptyClassRangesNoDash

產生式 NonemptyClassRangesNoDash :: ClassAtom 執行一個 ClassAtom 獲取結果 CharSet 並返回。

產生式 NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash 的結果根據以下步驟:

  1. 執行 ClassAtomNoDash 得到一個 CharSet A
  2. 執行 NonemptyClassRangesNoDash 得到一個 CharSet B
  3. 返回 CharSet A CharSet B 的並集。

產生式 NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassRanges 按下面的步驟執行:

  1. 執行 ClassAtomNoDash 得到一個 CharSet A
  2. 執行 ClassAtom 得到一個 CharSet B
  3. 執行 ClassRanges 得到一個 CharSet C
  4. D 爲調用方法 CharacterRange(A, B) 返回的 CharSet
  5. 返回 CharSet D CharSet C 的並集。
注: ClassRanges 可以擴展到單獨的 ClassAtoms/ 或 兩個 ClassAtom 的範圍,用橫杆隔開。

後面的情況中 ClassRanges 包含從第一個 ClassAtom 與第二個 ClassAtom 之間的所有字符。

如果其中一個 ClassAtom 不描述單一字符(例如\w)或如果第一個 ClassAtom 的單位代碼值大於第二個 ClassAtom,則產生一個錯誤。
注: 如果模式語句無視大小寫,那麼範圍兩端的特徵決定這個範圍包含那些字符。因此,例如這個模式語句是 /[E-F]/i 可以匹配的字符只有 EFef,如果模式語句是 /E-f/i 就可以匹配所有大小寫字母和這些特殊符號:[\]^_`
注: "-" 可以作爲字符處理,也可以指定一個範圍。如果它是 ClassRange 的第一個或最後一個字符、範圍規範的開始或結束限制、或直接跟上一個範圍規範,那麼它被作爲字符處理。


字符類原子(ClassAtom

產生式 ClassAtom :: - 執行返回包含單個字符 - 的字符集。

產生式 ClassAtom :: ClassAtomNoDash 通過執行 ClassAtomNoDash 獲得並返回這個 CharSet


非連接符字符類原子(ClassAtomNoDash

產生式 ClassAtomNoDash :: SourceCharacter 不包括 \]- 執行返回包含由 SourceCharacter 表示的字符的單元素字符集。

產生式 ClassAtomNoDash :: \ ClassEscape 通過執行 ClassEscape 得到並返回這個 CharSet


字符類可用轉義(ClassEscape

產生式 ClassEscape :: DecimalEscape 按如下方式執行:

  1. 執行 DecimalEscape 得到 EscapeValue E
  2. 如果 E 不是一個字符,拋出 SyntaxError 異常。
  3. chE 的字符。
  4. 返回包含字符 ch 的單元素 CharSet

產生式 ClassEscape :: b 執行返回包含一個 <BS> 字符(Unicode 值 0008)的字符集。

產生式 ClassEscape :: CharacterEscap 通過執行 CharacterEscap 獲得一個字符 CharSet 並返回包含該字符的單元素字符集 CharSet

產生式 ClassEscape :: CharacterClassEscape 通過執行 CharacterClassEscape 獲得並返回這個CharSet

注: ClassAtom 可以使用除\b\B後向引用,以外的轉義序列。在 CharacterClass 中,\b 表示退格符。而,\B後向引用會報錯。同樣,在一個 ClassAtom 中使用後向引用會報錯。


RegExp 構造器作爲函數調用


RegExp(pattern, flags)

如果 pattern 是一個對象 R,其內部屬性 [[Class]]"RegExp"flagsundefined,返回 R。否則,調用內置RegExp構造器,通過表達式 new RegExp(pattern, flags) 返回由該構造器構造的對象。V8.png


RegExp 構造器

RegExp作爲 new 表達式一部分調用時,它是一個構造器,用來初始化一個新創建的對象。


new RegExp(pattern, flags)

如果 pattern 是一個對象且它的 [[Class]] 內部屬性爲 "RegExp",則令 Rpattern。接着,如果 flagsundefined,則令 P 爲構造 R 時使用的 pattern,令 F 爲構造 R 時使用的 flags,否則拋出TypeError異常。對於其它情況,如果 patternundefined,則令 P 爲空字符串,否則令 P ToString(pattern),如果 flagsundefined,則令 F 爲空字符串,否則令 F ToString(flags)。

如果字符 P 不滿足 Pattern 句法,那麼拋出 SyntaxError 異常。否則,令新構造的對象擁有內部 [[Match]] 屬性,該屬性通過執行(編譯)字符 P 作爲在 15.10.2 節描述的 Pattern

如果 F 含有除 "g""i""m" 外的任意字符,或者 F 中包括出現多次的字符,那麼,拋出SyntaxError異常。 V8.png

如果 SyntaxError 異常未拋出,那麼:

S 爲一個字符串,其等價於 P 表示的 PatternS 中的字符按如下描述進行轉義。這樣,S 可能或者不會與 P 或者 Pattern 相同;然而,由執行 S 作爲一個 Pattern 的內部處理程序必須和通過構造對象的內部 [[Match]] 屬性的內部處理程序完全相同。

如果 Pattern 裏存在字符 / 或者 \ ,那麼這些字符應該被轉義,以確保由 "/"S"/" 構成的字符串的 S 值有效,而且 F 能被解析(在適當的詞法上下文中)爲一個與構造的正則表達式行爲完全相同的 RegularExpressionLiteral 。例如,如果 P"/",那麼 S 應該爲 "\/" "\u002F",而不是 "/",因爲 F 後的 /// 會被解析爲一個 SingleLineComment,而不是一個 RegularExpressionLiteral。 如果 P 爲空字符串,那麼該規範定義爲令 S"(?:)"

這個新構造對象的如下屬性爲數據屬性,其特性在 15.10.7 中定義。各屬性的 [[Value]] 值按如下方式設置:

source 屬性置爲 S

global 屬性置爲一個 Boolean 值。當 F 含有字符 g 時,爲 true,否則,爲 false

IgnoreCase 屬性置爲一個 Boolean 值。當 F 含有字符 i 時,爲 true,否則,爲 false

multiline 屬性置爲一個 Boolean 值。當 F 含有字符 m 時,爲 true,否則,爲 false

lastIndex 屬性置爲 0

其內部 [[Prototype]] 屬性置爲 15.10.6 中定義的內置 RegExp 原型對象。

其內部 [[Class]] 屬性置爲 "RegExp"

注: 如果 PatternStringLiteral,一般的轉義字符替換髮生在被 RegExp 處理前。如果 Pattern 必須含有 RegExp 識別的轉義字符,那麼當構成 StringLiteral 的內容時,爲了防止被移除 \ 被移除,在 StringLiteral 中的任何 \ 必須被轉義


RegExp構造器的屬性

RegExp 構造器的[[Prototype]]值爲內置 Function 的原型(15.3.4)。

除了內部的一些屬性和 length 屬性(其值爲2),RegExp 構造器還有如下屬性:


RegExp.prototype

RegExp.prototype的初始值爲RegExp的原型(15.10.6)。

該屬性有這些特性: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


RegExp.Prototype的屬性

RegExp 的原型的內部 [[Prototype]] 屬性爲 Object 的原型(15.2.4)。RegExp 的原型爲其本身的一個普通的正則表達式對象;它的[[Class]]"RegExp"RegExp 的原型對象的數據式屬性的初始值被設置爲彷彿由內置 RegExp 構造器深生成的表達式 new RegExp() 創建的對象。

'RegExp 的原型本身沒有 valueOf 屬性;然而,該 valueOf 屬性是繼承至 Object 的原型。

在作爲 RegExp 原型對象的屬性的如下函數描述中,"this RegExp object" 是指函數激活時 this 對象;如果 this 值不是一個對象,或者一個其內部 [[Class]] 屬性值不是 "RegExp" 的對象,那麼一個 TypeError 會拋出。


RegExp.prototype.constructor

RegExp.prototype.constructor 的初始值爲內置 RegExp 構造器。V8.png


RegExp.prototype.exec(string)

  1. R 爲該 RegExp 對象。
  2. SToString(string)的值。V8.png
  3. lengthS 的長度。
  4. lastIndex 爲以參數 "lastIndex" 調用 R 的內部方法 [[Get]] 的結果。
  5. i ToInteger(lastIndex) 的值。
  6. global 爲以參數 "global" 調用 R 的內部方法 [[Get]] 的結果。
  7. globalfalse,則令 i = 0
  8. matchSucceededfalse
  9. matchSucceededfalse 前重複以下。
    1. i < 0 或者 i > length,則
      1. 以參數 "lastIndex"0true 調用 R 的內部方法[[Put]]
      2. 返回 null
    2. 以參數 Si 調用 R 的內部方法[[Match]]
    3. [[Match]] 返回失敗,則
      1. i = i + 1
    4. 否則
      1. r 爲調用 [[Match]] 的結果 State
      2. matchSucceededtrue
  10. erendIndex 值。
  11. globaltrue,
  12. 以參數 "lastIndex"etrue 調用 R 的內部方法 [[Put]]
  13. nr 的捕獲數組的長度。(這跟 15.10.2.1 NcapturingParens 是同一個值)
  14. A 爲如同以表達式 new Array 創建的新數組,其中Array是這個名字的內置構造器。
  15. matchIndex 爲匹配到的子串在整個字符串 S 中的位置。
  16. 以參數 "index",屬性描述 {[[Value]]: matchIndex, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法 [[DefineOwnProperty]]
  17. 以參數 "input",屬性描述 {{[[Value]]: S, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法[[DefineOwnProperty]]
  18. 以參數"length",屬性描述 {[[Value]]: n + 1} 和 true 調用 A 的內部方法[[DefineOwnProperty]]
  19. matchedSubstr 爲匹配到的子串(例如:S 中從 i 位置<包含>到 e 位置<不包含>的部分 )。
  20. 以參數 "0",屬性描述 {{[[Value]]: matchedSubstr, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法[[DefineOwnProperty]]
  21. 對每一滿足 I > 0In 的整數 i
    1. captureI 爲第 i 個捕獲數組中的元素。
    2. 以參數 ToString(i),屬性描述 {[[Value]]: captureI, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法 [[DefineOwnProperty]]
  22. 返回 A


RegExp.prototype.test(string)

採用如下步驟:

  1. match 爲在這個 RegExp 對象上使用 string 作爲參數執行 RegExp.prototype.exec 的結果。V8.png
  1. 如果 match 不爲 null,返回 true;否則返回 false


RegExp.prototype.toString()

返回一個 String,由 "/"RegExp 對象的 source 屬性值、"/""g"(如果 global 屬性爲 true),"i"(如果 IgnoreCasetrue),"m"(如果 multilinetrue)通過連接組成。V8.png

注: 如果返回的字符串包含一個 RegularExpressionLiteral,那麼該 RegularExpressionLiteral 用同樣的方式解釋執行。


RegExp實例的屬性

RegExp 實例繼承至 RegExp 原型對象,其 [[Class]] 內部屬性值爲 "RegExp"RegExp 實例也擁有一個 [[Match]] 內部屬性和一個 length 屬性。

內部屬性 [[Match]] 的值是正則表達式對象的 Pattern 的依賴實現的表示形式。

RegExp實例還有如下屬性。


source

source 屬性爲構成正則表達式 Pattern 的字符串。該屬性擁有這些特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


global

global 屬性是一個 Boolean 值,表示正則表達式 flags 是否有 "g"。該屬性擁有這些特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


ignoreCase

ignoreCase 屬性是一個 Boolean 值,表示正則表達式 flags 是否有 "i"。該屬性擁有這些特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


multiline

multiline 屬性是一個 Boolean 值,表示正則表達式 flags 是否有 "m"。該屬性擁有這些特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


lastIndex

lastIndex 屬性指定從何處開始下次匹配的一個字符串類型的位置索引。當需要時該值會轉換爲一個整型數。該屬性擁有這些特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

注: 不同於其他 RegExp 實例內置屬性,lastIndex 是可寫的。

Error對象

Error 對象的實例在運行時遇到錯誤的情況下會被當做異常拋出。Error 對象也可以作爲用戶自定義異常類的基對象。


Error構造器作爲函數調用

Error 被作爲函數而不是構造器調用時,它創建並初始化一個新的 Error 對象。這樣函數調用 Error(…) 與同樣參數的對象創建表達式 new Error(…) 是等效的。


Error (message)

新構造的對象內部屬性 [[Prototype]] 會被設爲原本的 Error 原型對象,也就是 Error.prototype 的初始值。(15.11.3.1)V8.png

新構造的對象內部屬性 [[Class]] 會被設爲 "Error"

新構造的對象內部屬性 [[Extensible]] 會被設爲 true

如果形參 message 不是 undefined,新構造的對象本身屬性 message 則被設爲 ToString(message)。


Error構造器

Error 作爲 new 表達式的一部分被調用時,它是一個構造器:它初始化新創建的對象。


new Error (message)

新構造的對象內部屬性 [[Prototype]] 會被設爲原本的 Error 原型對象,也就是 Error.prototype 的初始值。(15.11.3.1)

新構造的對象內部屬性 [[Class]] 會被設爲"Error"

新構造的對象內部屬性 [[Extensible]] 會被設爲true

如果形參 message 不是undefined,新構造的對象本身屬性 message 則被設爲ToString(message)。


Error構造器的屬性

Error構造器的內部屬性[[Prototype]]值爲Function原型對象(15.3.4)。

除內部屬性和 length 屬性(其值爲1)以外,Error構造器還有以下屬性:


Error.prototype

Error.prototype 的初始值爲 Error 原型對象(15.3.4)。V8.png

此屬性有以下特性: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


Error 原型對象的屬性

Error原型對象本身是一個Error對象(其[[Class]]"Error")。

Error原型對象的內部屬性 [[Prototype]] 爲標準內置的 Object 原型對象


Error.prototype.constructor

Error.prototype.constructor 初始值爲內置的 Error 構造器。V8.png


Error.prototype.name

Error.prototype.name 初始值爲 "Error"


Error.prototype.message

Error.prototype.message 初始值爲空字符串。V8.png


Error.prototype.toString ( )

執行以下步驟

  1. Othis
  2. 如果 Type(O) 不是對象,拋出一個TypeError異常。V8.png
  3. name 爲以"name"爲參數調用 O [[Get]] 內置方法的結果。
  4. 如果 nameundefined, 令 name"Error";否則令 nameToString(name)。
  5. msg 爲以"message"爲參數調用 O [[Get]] 內置方法的結果。
  6. 如果 msgundefined,令 msg 爲空字符串;否則令 msgToString(msg)。
  7. 如果 namemsg 都是空字符串,返回"Error"
  8. 如果 name 爲空字符串,返回 msg
  9. 如果 msg 爲空字符串,返回 name
  10. 返回拼接 name、":"、一個空格字符,以及 msg 的結果。


Error實例的屬性

Error 實例從 Error 原型對象繼承屬性,且它們的內部屬性 [[Class]] 值爲"Error"Error實例沒有特殊屬性。


用於本標準的內部錯誤類型

以下原生 Error 對象之一會在運行時錯誤發生時被拋出。所有這些對象共享同樣的結構,如 15.11.7 所述。


EvalError

本規範現在已經不再使用這個異常,這個對象保留用於跟規範之前版本的兼容性。


RangeError

表示一個數值超出了允許的範圍,見 15.4.2.2, 15.4.5.1, 15.7.4.2, 15.7.4.5, 15.7.4.6, 15.7.4.7, 15.9.5.43


ReferenceError

表示一個不正確的引用值被檢測到。見 8.7.1, 8.7.2, 10.2.1, 10.2.1.1.4, 10.2.1.2.4, 11.13.1


SyntaxError

表示一個解析錯誤發生。見 11.1.5, 11.3.1, 11.3.2, 11.4.1, 11.4.4, 11.4.5, 11.13.1, 11.13.2, 12.2.1, 12.10.1, 12.14.1, 13.1, 15.1.2.1, 15.3.2.1, 15.10.2.2, 15.10.2.5, 15.10.2.9, 15.10.2.15, 15.10.2.19, 15.10.4.1, 15.12.2


TypeError

表示一個操作數的真實類型與期望類型不符。見 8.6.2, 8.7.2, 8.10.5, 8.12.5, 8.12.7, 8.12.8, 8.12.9, 9.9, 9.10, 10.2.1, 10.2.1.1.3, 10.6, 11.2.2, 11.2.3, 11.4.1, 11.8.6, 11.8.7, 11.3.1, 13.2, 13.2.3, 15, 15.2.3.2, 15.2.3.3, 15.2.3.4, 15.2.3.5, 15.2.3.6, 15.2.3.7, 15.2.3.8, 15.2.3.9, 15.9.5.44, 15.2.3.11, 15.2.3.12, 15.2.3.13, 15.2.3.14, 15.2.4.3, 15.3.4.2, 15.3.4.3, 15.3.4.4, 15.3.4.5, 15.3.4.5.2, 15.3.4.5.3, 15.3.5, 15.3.5.3, 15.3.5.4, 15.4.4.3, 15.4.4.11, 15.4.4.16, 15.4.4.17, 11.4.1, 15.4.4.19, 15.4.4.20, 15.4.4.21, 15.4.4.22, 15.4.5.1, 15.5.4.2, 15.5.4.3, 15.6.4.2, 15.6.4.3, 15.7.4, 15.7.4.2, 15.7.4.4, 15.7.4.8, 15.9.5, 15.9.5.44, 15.10.4.1, 15.10.6, 15.11.4.4, 15.12.3


URIError

表示全局 URI 處理函數被以不符合其定義的方式使用。見 15.1.3


NativeError對象結構

當 ECMAScript 實現探測到一個運行時錯誤時,它拋出一個 15.11.6 所定義的 NativeError 對象的實例。每個這些對象都有如下所述結構,不同僅僅是在 name 屬性中以構造器名稱替換掉 NativeError,以及原型對象由實現自定義的 message 屬性。

對於每個錯誤對象,定義中到 NativeError 的引用應當用 15.11.6 中具體的對象名替換。V8.png


NativeError構造器作爲函數調用

NativeError 被作爲函數而不是構造器調用時,它創建並初始化一個新的 NativeError 對象。這樣函數調用 NativeError(…) 與同樣參數的對象創建表達式 new NativeError(…) 是等效的。


NativeError (message)

新構造的對象內部屬性 [[Prototype]] 會被設爲這一錯誤構造器附帶的原型對象。(15.11.3.1

新構造的對象內部屬性 [[Class]] 會被設爲 "Error"

新構造的對象內部屬性 [[Extensible]] 會被設爲 true

如果形參 message 不是 undefined,新構造的對象本身屬性 message 則被設爲ToString(message)。


NativeError構造器

NativeError 作爲 new 表達式的一部分被調用時,它是一個構造器:它初始化新創建的對象。


New NativeError (message)

新構造的對象內部屬性[[Prototype]]會被設爲這一錯誤構造器附帶的原型對象。(15.11.3.1)

新構造的對象內部屬性[[Class]]會被設爲 "Error"

新構造的對象內部屬性[[Extensible]]會被設爲 true

如果形參 message 不是undefined,新構造的對象本身屬性 message 則被設爲ToString(message)。


NativeError構造器的屬性

NativeError構造器的內部屬性[[Prototype]]值爲Function原型對象(15.3.4)。

除內部屬性和 length 屬性(其值爲1)以外,Error構造器還有以下屬性:


NativeError.prototype

NativeError.prototype 的初始值爲一個 Error(15.11.4)。

此屬性有以下特性: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。


NativeError原型對象的屬性

每個 NativeError [[Prototype]] 的初始值爲一個 Error(其[[Class]]"Error")。

NativeError 原型對象的內部屬性 [[Prototype]] 爲標準內置的 Error 對象(15.2.4)。


NativeError.prototype.constructor

對於特定的 NativeError,其 Error.prototype.constructor 初始值爲 NativeError 構造器本身。


NativeError.prototype.name

對於特定的 NativeError,Error.prototype.name 初始值爲構造器的名字。


NativeError.prototype.message

對於特定的 NativeError,NativeError.prototype.message 初始值爲空字符串。


NativeError 實例的屬性

NativeError 實例從 NativeError 原型對象繼承屬性,且它們的內部屬性 [[Class]] 值爲 "Error"Error 實例沒有特殊屬性。


JSON 對象

JSON 對象是一個單一的對象,它包含兩個函數,parsestringify,是用於解析和構造 JSON 文本的。JSON 數據的交換格式在 RFC4627 裏進行了描述。本規範裏面的 JSON 交換格式會使用 RFC4627 裏所描述的,以下兩點除外:

  • ECMAScript JSON 文法中的頂級 JSONText 產生式是由 JSONValue 構成,而不是 RFC4627 中限制成的 JSONObject 或者 JSONArray
  • 確認 JSON.parseJSON.stringify 的實現,它們必須準確的支持本規範描述的交換格式,而不允許對格式進行刪除或擴展。這一點要區別於 RFC4627,它允許 JSON 解析器接受 non-JSON 的格式和擴展。

JSON 對象內部屬性 [[Prototype]] 的值是標準內建的 Object 原型對象(15.2.4)。內部屬性 [[Class]] 的值是 "JSON"。內部屬性 [[Extensible]] 的值設置爲 true

JSON 對象沒有內部屬性 [[Construct]];不能把 JSON 對象當作構造器來使用 new 操作符。

JSON 對象沒有內部屬性 [[Call]];不能把 JSON 對象當作函數來調用。


JSON 語法

JSON.stringify 會產生一個符合 JSON 語法的字符串。JSON.parse 接受的是一個符合 JSON 語法的字符串。


JSON 詞法

類似於 ECMAScript 源文本,JSON 是由一系列符合 SourceCharacter 規則的字符構成的。JSON 詞法定義的 Token 使得 JSON 文本類似於 ECMAScript 詞法定義的 Token 得到的 ECMAScript 源文本。JSON 詞法僅能識別由 JSONWhiteSpace 產生式得到的空白字符。在語法上,所有非終止符均不是由 "JSON" 字符開始,而是由 ECMAScript 詞法產生式定義的。

語法

   JSONWhiteSpace :: Note.png
       <TAB>
       <CR>
       <LF>
       <SP>
   JSONString ::
       " JSONStringCharactersopt "
   JSONStringCharacters ::
       JSONStringCharacter JSONStringCharactersopt
   JSONStringCharacter ::
       SourceCharacter but not " or \ U+0000 or through U+001F
       \ JSONEscapeSequence
   JSONEscapeSequence ::
       JSONEscapeCharacter
       UnicodeEscapeSequence
   JSONEscapeCharacter :: 以下之一 
       " / \ b f n r t
   JSONNumber ::
       -opt DecimalIntegerLiteral JSONFractionopt ExponentPartopt
   JSONFraction ::
       . DecimalDigits
   JSONNullLiteral ::
       NullLiteral
   JSONBooleanLiteral ::
       BooleanLiteral


JSON 句法

根據 JSON 詞法定義的 TokenJSON 句法定義了一個合法的 JSON 文本。語法的目標符號是 JSONText

語法

   JSONText :
       JSONValue
   JSONValue :
       JSONNullLiteral
       JSONBooleanLiteral
       JSONObject
       JSONArray
       JSONString
       JSONNumber
   JSONObject :
       { }
       { JSONMemberList }
   JSONMember :
       JSONString : JSONValue
   JSONMemberList :
       JSONMember
       JSONMemberList , JSONMember
   JSONArray :
       [ ]
       [ JSONElementList ]
   JSONElementList :
       JSONValue
       JSONElementList , JSONValue


parse ( text [ , reviver ] )

parse 函數解析一段 JSON 文本(JSON 格式字符串),生成一個 ECMAScript 值。JSON 格式是ECMAScript直接量的受限模式。JSON 對象可以被理解爲 ECMAScript 對象。JSON 數組可以被理解爲 ECMAScript 數組。JSON 的字符串、數字、布爾值以及 null 可以被認爲是 ECMAScript 字符串、數字、布爾值以及 nullJSON 使用受限更多的空白字符集合,並且允許 Unicode 碼點 U+2028U+2029直 接出現在 JSONString 直接量當中而無需使用轉義序列。解析流程與 11.1.4 11.1.5 一樣,但是由 JSON 語法限定。

可選參數 reviver 是一個接受兩個參數的函數(keyvalue)。它可以過濾和轉換結果。它在每個 key/value 對產生時被調用,它的返回值可以用於替代原本的值。如果它原樣返回接收到的,那麼結構不會被改變。如果它返回 undefined,那麼屬性會被從結果中刪除。

  1. JText ToString(text)。V8.png
  2. 15.12.1 所述語法解析 JText。如果 JText 不能以 JSON 語法解析成 JSONText,則拋出 SyntaxError 異常。
  3. unfiltered 爲按 ECMAScript 程序(但是用 JSONString 替換 StringLiteral)解析和執行 JText 的結果。注因 JText 符合JSON語法,這個結果要麼是原始值類型要麼是 inlineArrayLiteral 或者 ObjectLiteral 所定義的對象。
  4. IsCallable(reviver) 爲 true
    1. root 爲由表達式 new Object() 創建的新對象,其中 Object 是以 Object 爲名的標準內置的構造器。
    2. 以空字符串和屬性描述 {[[Value]]: unfiltered, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 爲參數調用 root[[DefineOwnProperty]] 內置方法。
    3. 返回傳入 root 和空字符串爲參數調用抽象操作 Walk 的結果,抽象操作 Walk 如下文所定義。V8.png
  5. 否則,返回 unfilteredV8.png

抽象操作 Walk 是一個遞歸的抽象操作,它接受兩個參數:一個 holder 對象和一個表示該對象的屬性名的 String nameWalk 使用最開始被傳入 parse 函數的 reviver 的值。

  1. val 爲以參數 name 調用 holder [[Get]] 內部方法的結果。
  2. val 爲對象,則
    1. val [[Class]] 內部屬性爲 "Array"
      1. I0
      2. len 爲以參數 "length" 調用 val [[Get]] 內部方法的結果。
      3. I < len 時重複
        1. newElement 爲調用抽象操作 Walk 的結果,傳入 val ToString(I) 爲參數。
        2. newElementundefined,則
          1. ToString(I) 和 false 做參數,調用 val 的內部方法 [[Delete]]
          2. 否則,以ToString(I),屬性描述 {[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 以及 false 做參數調用 val 的內部方法[[DefineOwnProperty]]
        3. I1
    2. 否則
      1. keys 爲包含 val 所有的具有 [[Enumerable]] 特徵的屬性名 String 值的內部類型 List。字符串的順序應當與內置函數 Object.keys 一致。
      2. 對每個 keys 中的字符串 P 做以下操作
        1. newElement 爲調用抽象操作 Walk 的結果,傳入 valP 爲參數。
        2. newElementundefined,則
          1. Pfalse 做參數,調用 val 的內部方法 [[Delete]]V8.png
          2. 否則,以 P,屬性描述{[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 做參數調用調用 val 的內部方法 [[DefineOwnProperty]]
  3. 返回傳入 holder 作爲 this 值以及以 nameval 構成的參數列表調用 reviver[[Call]]內部屬性的結果。

實現不允許更改 JSON.parse 的實現以擴展 JSON 語法。如果一個實現想要支持更改或者擴展過的 JSON 交換格式它必須以定義一個不同的 parse 函數的方式做這件事。

注:在對象中存在同名字符串的情況下,同一 key 的值會被按照文本順序覆蓋掉。Note.png


stringify ( value [ , replacer [ , space ] ] )

stringify 函數返回一個 JSON 格式的字符串,用以表示一個ECMAScript值。它可以接受三個參數。第一個參數是必選的。value 參數是一個ECMAScript 值,它通常是對象或者數組,儘管它也可以是 StringBooleanNumber 或者是 null。可選的 replacer 參數要麼是個可以修改對象和數組字符串化的方式的函數,要麼是個扮演選擇對象字符串化的屬性的白名單這樣的角色的 StringNumber 組成的數組。可選的 space 參數是一個 String 或者 Number,可以允許結果中插入空白符以改善人類可讀性。 V8.png V8.png

以下爲字符串化一對象的步驟:

  1. stack 爲空 List
  2. indent 爲空 String
  3. PropertyListReplacerFunctionundefined
  4. Type(replacer) 爲 Object,則
    1. IsCallable(replacer) 爲 true,則
      1. ReplacerFunctionreplacer
    2. 否則若 replacer 的內部屬性 [[Class]]"Array",則
      1. PropertyList 爲一空內部類型 List
      2. 對於所有名是數組下標的 replacer 的屬性 v。以數組下標遞增順序枚舉屬性
        1. itemundefined
        2. Type(v) 爲 String 則令 itemv
        3. 否則若 Type(v) 爲 Number 則令 item ToString(v)。
        4. 否則若 Type(v) 爲 Object 則,
          1. v [[Class]] 內部屬性爲 "String""Number" 則令 itemToString(v)。
        5. item 不是 undefineditem 不是 PropertyList 的元素。
          1. item 添加到 PropertyList 中。
  5. Type(space) 爲 Object 則,
    1. space [[Class]] 內部屬性爲 "Number" 則,
      1. space ToNumber(space)。V8.png
    2. 否則若 space [[Class]] 內部屬性爲 "String" 則,
      1. space ToString(space)。V8.png
  6. Type(space) 爲 Number
    1. space min(10, ToInteger(space))。
    2. gap 爲一包含 space 個空格的 String。這將會是空 String 加入 space 小於1
  7. 否則若 Type(space) 爲String
    1. space 中字符個數爲 10 或者更小,設 gapspace,否則設 gap 爲包含前 10space 中字符的字符串。
  8. 否則設 gap 爲空 String
  9. wrapper 爲一個如同以表達式 new Object() 創建的新對象,其中 Object 是這個名字的標準內置構造器。
  10. 以參數空 String,屬性描述{[[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 調用 wrapper[[DefineOwnProperty]]內部方法。
  11. 返回以空 Stringwrapper 調用抽象方法 Str 的結果。


抽象操作 Str(key, holder) 可以訪問調用它的 stringify 方法中的 ReplacerFunction。其算法如下:V8.png

  1. value 爲以 key 爲參數調用 holder 的內部方法[[Get]]
  2. Type(value) 爲 Object,則 Note.png V8.png
    1. toJSON 爲以 "toJSON" 爲參數調用 value 的內部方法 [[Get]]
    2. IsCallable(toJSON) 爲 true
      1. value 爲以調用 toJSON 的內部方法 [[Call]] 的結果,傳入 valuethis值以及由 key 構成的參數列表。
  3. ReplacerFunction 不爲 undefined,則
    1. value 爲以調用 ReplacerFunction 的內部方法 [[Call]] 的結果,傳入 holderthis 值以及由 keyvalue 構成的參數列表。
  4. Type(value) 爲 Object 則,
    1. value [[Class]] 內部屬性爲 "Number" 則,
      1. valueToNumber(value)。
    2. 否則若 value [[Class]] 內部屬性爲 "String" 則,
      1. value ToString(value)
    3. 否則若 value [[Class]] 內部屬性爲 "Boolean" 則,
      1. valuevalue [[PrimitiveValue]] 內部屬性值
  5. valuenull 則 返回 "null"
  6. valuetrue 則 返回 "true"
  7. valuefalse 則 返回 "false"
  8. Type(value) 爲 String,則返回以value調用Quote抽象操作的結果。
  9. Type(value) 爲 Number
    1. value 是有限的數字則 返回 ToString(value)。
    2. 否則,返回 "null"
  10. Type(value) 爲 Object IsCallable(value) 爲 false
    1. value[[Class]]內部屬性爲 "Array"
      1. 返回以 value 爲參數調用抽象方法 JA 的結果。
    2. 否則,返回以 value 爲參數調用抽象方法 JO 的結果。
  11. 返回 undefined


抽象操作 Quote(value) 將一個 String 值封裝在雙引號中,並且對其中的字符轉義。V8.png

  1. product 爲雙引號字符。
  2. value 中的每一個字符 C
    1. C 爲雙引號字符或者反斜槓字符
      1. productproduct 和反斜槓連接的結果。
      2. productproductC 的連接。
    2. 否則若 C 爲退格符、換頁符、換行符、回車符或製表符
      1. productproduct 與反斜槓字符的連接。
      2. abbrev 爲如下表所示 C 對應的字符:
        退格符 "b"
        換頁符 "f"
        換行符 "n"
        回車符 "r"
        製表符 "t"
      3. productproductabbrev 的連接。
    3. 否則若 C 爲代碼值小於空白字符 Note.png 的控制字符。
      1. productproduct 與反斜槓字符的連接。
      2. productproduct"u" 的連接。
      3. hex 爲轉換 C 代碼值按十六進制轉換到四位字符串的結果。
      4. productproducthex 的連接。
    4. 否則
      1. productproductC 的連接。
  3. productproduct 與雙引號字符的連接。
  4. 返回 product


抽象操作 JO(value) 序列化一個對象,它可以訪問調用它的方法中的 stackindentgapPropertyListReplacerFunction 以及 space Bug.pngV8.png

  1. stack 包含 value,則拋出一個TypeError,因爲對象結構中存在循環。 Question.png
  2. value 添加到 stack Question.png
  3. stepbackindent
  4. indentindentgap 的連接。
  5. PropertyList 不爲 undefined
    1. KPropertyList
  6. 否則
    1. Kvalue 上所有 [[Enumerable]] 特性爲 true 的自身屬性名構成的內部字符串列表。其順序應該和 Object.keys 標準內置函數得到的順序相同。
  7. partial 爲空 List
  8. 對於 K 的每一個元素 P
    1. strP 爲以 Pvalue 爲參數調用抽象操作 Str 的結果。
    2. strP 沒有被定義
      1. member 爲以 P 爲參數調用抽象操作P的結果。
      2. membermember 與冒號字符的連接。
      3. gap 不爲空 String
        1. membermember 與空格字符 Bug.png 的連接。
      4. membermemberstrP 的連接。
      5. member 添加到 partial
  9. partialempty,則
    1. final"{}"
  10. 否則
    1. gap 爲空 String
      1. properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用逗號分隔。第一個字符串之前和最後一個字符串之後沒有逗號。
      2. final 爲連接 "{"properties、和 "}" 的結果。
    2. 否則 gap 不是空 String
      1. separator 爲連接 逗號字符,換行字符以及 indent 而成的字符串。
      2. properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用 separator 分隔。第一個字符串之前和最後一個字符串之後沒有 separator
      3. final 爲連接 "{"、換行符、indentproperties、換行符、stepback"}" 的結果。
  11. 移除 stack 中的最後一個元素。 Question.png
  12. indentstepback
  13. 返回 final


抽象操作 JA(value) 序列化一個數組。它可以訪問調用它的 stringify 方法中的 stackindentgapPropertyListReplacerFunction 以及 space Bug.png。數組的表示中僅包擴零到 array.length - 1的區間。命名的屬性將會被從字符串化操作中排除。數組字符串化成開頭的左方括號,逗號分隔的元素,以及結束的右方括號。V8.png

  1. stack 包含 value,則拋出一個TypeError,因爲對象結構中存在循環。 Question.png
  2. value 添加到 stack Question.png
  3. stepbackindent
  4. indentindentgap 的連接。
  5. partial 爲空 List
  6. len 爲以 "length" 爲參數調用 value 的內部方法 [[Get]]
  7. index0
  8. index < len 時重複以下
    1. strP 爲傳入 ToString(index) 與 value 作爲參數調用抽象方法 Str 的結果。
    2. strPundefined
      1. 添加 nullpartial
    3. 否則
      1. 添加 strPpartial
    4. 使 index 增加1
  9. partial 爲空,則
    1. final"[]"
  10. 否則
    1. gap 爲空 String
      1. properties 爲爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用逗號分隔。第一個字符串之前和最後一個字符串之後沒有逗號。
      2. final 爲連接 "["properties"]" 的結果。
    2. 否則
      1. separator 爲逗號字符,換行字符以及 indent 而成的字符串。
      2. properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用 separator 分隔。第一個字符串之前和最後一個字符串之後沒有 separator
      3. final 爲連接 "["、換行符、indentproperties、換行符、stepback"]" 的結果。
  11. 移除 stack 中的最後一個元素。 
  12. indentstepback
  13. 返回 final
注: JSON 結構允許任何深度的嵌套,但是不能夠循環引用。若 value 是或者包含了一個循環結構,則 stringify 函數必須拋出一個 TypeError 異常。以下是一個不能夠被字符串化的值的例子:
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw an TypeError.
注:符號式簡單值按以下方式表示:
  1. null 值在 JSON 文本中表示爲 String null
  2. undefined 值不出現。
  3. true 值在 JSON 文本中表示爲 String true
  4. false 值在 JSON 文本中表示爲 String false
注: 字符串值用雙引號括起。字符 "\ 會被轉義成帶 \ 前綴的。控制字符用轉義序列 \uHHHH 替換,或者使用簡略形式 \b(退格符)、\f(換頁符)、\n(換行符)、\r(回車符)、\t(製表符)。
注: 有窮的數字按照調用 ToString(number) 字符串化。NaN 和不論正負的 Infinity 都表示爲字符串 null
注: 沒有 JSON 表示的值(如 undefined 和函數)不會產生字符串。而是會產生 undefined 值。在數組中這些值表示爲字符串 null。在對象中不能表示的值會導致屬性被排除在字符串化過程之外。
注: 對象表示爲開頭的左大括號跟着零個或者多個屬性,以逗號分隔,以右大括號結束。屬性是用用來表示 key 或者屬性名的引號引起的字符串,冒號然後是字符串化的屬性值。數組表示爲開頭的左方括號,後跟零個或者多個值,以逗號分隔,以右方括號結束。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章