Contents
- 1
全局對象
- 1.1 全局對象的值屬性
- 1.2 全局對象的函數屬性
- 1.3 處理 URI 的函數屬性
- 1.4
全局對象的構造器屬性
- 1.4.1 Object ( . . . )
- 1.4.2 Function ( . . . )
- 1.4.3 Array ( . . . )
- 1.4.4 String ( . . . )
- 1.4.5 Boolean ( . . . )
- 1.4.6 Number ( . . . )
- 1.4.7 Date ( . . . )
- 1.4.8 RegExp ( . . . )
- 1.4.9 Error ( . . . )
- 1.4.10 EvalError ( . . . )
- 1.4.11 RangeError ( . . . )
- 1.4.12 ReferenceError ( . . . )
- 1.4.13 SyntaxError ( . . . )
- 1.4.14 TypeError ( . . . )
- 1.4.15 URIError ( . . . )
- 1.5 全局對象的其他屬性
- 2
Object 對象
- 2.1 作爲函數調用 Object 構造器
- 2.2 Object 構造器
- 2.3
Object 構造器的屬性
- 2.3.1 Object.prototype
- 2.3.2 Object.getPrototypeOf ( O )
- 2.3.3 Object.getOwnPropertyDescriptor ( O, P )
- 2.3.4 Object.getOwnPropertyNames ( O )
- 2.3.5 Object.create ( O [, Properties] )
- 2.3.6 Object.defineProperty ( O, P, Attributes )
- 2.3.7 Object.defineProperties ( O, Properties )
- 2.3.8 Object.seal ( O )
- 2.3.9 Object.freeze ( O )
- 2.3.10 Object.preventExtensions ( O )
- 2.3.11 Object.isSealed ( O )
- 2.3.12 Object.isFrozen ( O )
- 2.3.13 Object.isExtensible ( O )
- 2.3.14 Object.keys ( O )
- 2.4 Object 的 prototype 對象的屬性
- 2.5 Object 的實例的屬性
- 3
Function 對象
- 3.1 作爲函數調用 Function 構造器
- 3.2 Function 構造器
- 3.3 Function 構造器的屬性
- 3.4 Function 的 prototype 對象的屬性
- 3.5 Function 的實例的屬性
- 4
Array 對象
- 4.1 作爲函數調用 Array 構造器
- 4.2 Array 構造器
- 4.3 Array 構造器的屬性
- 4.4
數組原型對象的屬性
- 4.4.1 Array.prototype.constructor
- 4.4.2 Array.prototype.toString ( )
- 4.4.3 Array.prototype.toLocaleString ( )
- 4.4.4 Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
- 4.4.5 Array.prototype.join (separator)
- 4.4.6 Array.prototype.pop ( )
- 4.4.7 Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
- 4.4.8 Array.prototype.reverse ( )
- 4.4.9 Array.prototype.shift ( )
- 4.4.10 Array.prototype.slice (start, end)
- 4.4.11 Array.prototype.sort (comparefn)
- 4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
- 4.4.13 Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
- 4.4.14 Array.prototype.indexOf ( searchElement [ , fromIndex ] )
- 4.4.15 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
- 4.4.16 Array.prototype.every ( callbackfn [ , thisArg ] )
- 4.4.17 Array.prototype.some ( callbackfn [ , thisArg ] )
- 4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )
- 4.4.19 Array.prototype.map ( callbackfn [ , thisArg ] )
- 4.4.20 Array.prototype.filter ( callbackfn [ , thisArg ] )
- 4.4.21 Array.prototype.reduce ( callbackfn [ , initialValue ] )
- 4.4.22 Array.prototype.reduceRight ( callbackfn [ , initialValue ] )
- 4.5 Array 實例的屬性
- 5
String 對象
- 5.1 作爲函數調用 String 構造器
- 5.2 String 構造器
- 5.3 String 構造器的屬性
- 5.4
字符串原型對象的屬性
- 5.4.1 String.prototype.constructor
- 5.4.2 String.prototype.toString ( )
- 5.4.3 String.prototype.valueOf ( )
- 5.4.4 String.prototype.charAt (pos)
- 5.4.5 String.prototype.charCodeAt (pos)
- 5.4.6 String.prototype.concat ( [ string1 [ , string2 [ , … ] ] ] )
- 5.4.7 String.prototype.indexOf (searchString, position)
- 5.4.8 String.prototype.lastIndexOf (searchString, position)
- 5.4.9 String.prototype.localeCompare (that)
- 5.4.10 String.prototype.match (regexp)
- 5.4.11 String.prototype.replace (searchValue, replaceValue)
- 5.4.12 String.prototype.search (regexp)
- 5.4.13 String.prototype.slice (start, end)
- 5.4.14 String.prototype.split (separator, limit)
- 5.4.15 String.prototype.substring (start, end)
- 5.4.16 String.prototype.toLowerCase ( )
- 5.4.17 String.prototype.toLocaleLowerCase ( )
- 5.4.18 String.prototype.toUpperCase ( )
- 5.4.19 String.prototype.toLocaleUpperCase ( )
- 5.4.20 String.prototype.trim ( )
- 5.5 String 實例的屬性
- 6 Boolean 對象
- 7 Number 對象
- 8
Math 對象
- 8.1 Math 對象的值屬性
- 8.2
Math 對象的函數屬性
- 8.2.1 abs (x)
- 8.2.2 acos (x)
- 8.2.3 asin (x)
- 8.2.4 atan (x)
- 8.2.5 atan2 (y, x)
- 8.2.6 ceil (x)
- 8.2.7 cos (x)
- 8.2.8 exp (x)
- 8.2.9 floor (x)
- 8.2.10 log (x)
- 8.2.11 max ( [ value1 [ , value2 [ , … ] ] ] )
- 8.2.12 min ( [ value1 [ , value2 [ , … ] ] ] )
- 8.2.13 pow (x, y)
- 8.2.14 random ( )
- 8.2.15 round (x)
- 8.2.16 sin (x)
- 8.2.17 sqrt (x)
- 8.2.18 tan (x)
- 9
Date 對象
- 9.1 Date 對象的概述和抽象操作的定義
- 9.2 作爲函數調用 Date 構造器
- 9.3 Date 構造器
- 9.4 Date 構造器的屬性
- 9.5
Date 原型對象的屬性
- 9.5.1 Date.prototype.constructor
- 9.5.2 Date.prototype.toString ( )
- 9.5.3 Date.prototype.toDateString ( )
- 9.5.4 Date.prototype.toTimeString ( )
- 9.5.5 Date.prototype.toLocaleString ( )
- 9.5.6 Date.prototype.toLocaleDateString ( )
- 9.5.7 Date.prototype.toLocaleTimeString ( )
- 9.5.8 Date.prototype.valueOf ( )
- 9.5.9 Date.prototype.getTime ( )
- 9.5.10 Date.prototype.getFullYear ( )
- 9.5.11 Date.prototype.getUTCFullYear ( )
- 9.5.12 Date.prototype.getMonth ( )
- 9.5.13 Date.prototype.getUTCMonth ( )
- 9.5.14 Date.prototype.getDate ( )
- 9.5.15 Date.prototype.getUTCDate ( )
- 9.5.16 Date.prototype.getDay ( )
- 9.5.17 Date.prototype.getUTCDay ( )
- 9.5.18 Date.prototype.getHours ( )
- 9.5.19 Date.prototype.getUTCHours ( )
- 9.5.20 Date.prototype.getMinutes ( )
- 9.5.21 Date.prototype.getUTCMinutes ( )
- 9.5.22 Date.prototype.getSeconds ( )
- 9.5.23 Date.prototype.getUTCSeconds ( )
- 9.5.24 Date.prototype.getMilliseconds ( )
- 9.5.25 Date.prototype.getUTCMilliseconds ( )
- 9.5.26 Date.prototype.getTimezoneOffset ( )
- 9.5.27 Date.prototype.setTime (time)
- 9.5.28 Date.prototype.setMilliseconds (ms)
- 9.5.29 Date.prototype.setUTCMilliseconds (ms)
- 9.5.30 Date.prototype.setSeconds (sec [, ms ] )
- 9.5.31 Date.prototype.setUTCSeconds (sec [, ms ] )
- 9.5.32 Date.prototype.setMinutes (min [, sec [, ms ] ] )
- 9.5.33 Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )
- 9.5.34 Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )
- 9.5.35 Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )
- 9.5.36 Date.prototype.setDate (date)
- 9.5.37 Date.prototype.setUTCDate (date)
- 9.5.38 Date.prototype.setMonth (month [, date ] )
- 9.5.39 Date.prototype.setUTCMonth (month [, date ] )
- 9.5.40 Date.prototype.setFullYear (year [, month [, date ] ] )
- 9.5.41 Date.prototype.setUTCFullYear (year [, month [, date ] ] )
- 9.5.42 Date.prototype.toUTCString ( )
- 9.5.43 Date.prototype.toISOString ( )
- 9.5.44 Date.prototype.toJSON ( key )
- 9.6 Date 實例的屬性
- 10
RegExp 對象
- 10.1 模式(Patterns)
- 10.2
模式語義(Pattern Semantics)
- 10.2.1 表示法(Notation)
- 10.2.2 模式(Pattern)
- 10.2.3 析取(Disjunction)
- 10.2.4 選擇項(Alternative)
- 10.2.5 匹配項(Term)
- 10.2.6 斷言(Assertion)
- 10.2.7 量詞(Quantifier)
- 10.2.8 原子(Atom)
- 10.2.9 轉義原子(AtomEscape)
- 10.2.10 轉義字符(CharacterEscap)
- 10.2.11 轉義十進制(DecimalEscape)
- 10.2.12 轉義字符類(CharacterClassEscape)
- 10.2.13 字符類(CharacterClass)
- 10.2.14 字符範圍集(ClassRanges)
- 10.2.15 非空字符範圍集(NonemptyClassRanges)
- 10.2.16 無連接符非空字符範圍集(NonemptyClassRangesNoDash)
- 10.2.17 字符類原子(ClassAtom)
- 10.2.18 非連接符字符類原子(ClassAtomNoDash)
- 10.2.19 字符類可用轉義(ClassEscape)
- 10.3 RegExp 構造器作爲函數調用
- 10.4 RegExp 構造器
- 10.5 RegExp構造器的屬性
- 10.6 RegExp.Prototype的屬性
- 10.7 RegExp實例的屬性
- 11
Error對象
- 11.1 Error構造器作爲函數調用
- 11.2 Error構造器
- 11.3 Error構造器的屬性
- 11.4 Error 原型對象的屬性
- 11.5 Error實例的屬性
- 11.6 用於本標準的內部錯誤類型
- 11.7
NativeError對象結構
- 11.7.1 NativeError構造器作爲函數調用
- 11.7.2 NativeError (message)
- 11.7.3 NativeError構造器
- 11.7.4 New NativeError (message)
- 11.7.5 NativeError構造器的屬性
- 11.7.6 NativeError.prototype
- 11.7.7 NativeError原型對象的屬性
- 11.7.8 NativeError.prototype.constructor
- 11.7.9 NativeError.prototype.name
- 11.7.10 NativeError.prototype.message
- 11.7.11 NativeError 實例的屬性
- 12 JSON 對象
全局對象
唯一的全局對象在控制進入任何執行環境前被創建。
除非另外指明,全局對象的標準內置屬性擁有特性 {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}。
全局對象沒有 [[Construct]] 內部屬性 ; 全局對象不可能當做構造器用 new 運算符調用。
全局對象沒有 [[Call]] 內部屬性,全局對象不可能當做函數來調用。
全局對象的 [[Prototype]] 和 [[Class]] 內部屬性值是依賴於實現的。
除了本規範定義的屬性之外,全局對象還可以擁有額外的宿主定義的屬性。全局對象可包含一個值是全局對象自身的屬性;例如,在 HTML 文檔對象模型中全局對象的 window 屬性是全局對象自身。
全局對象的值屬性
NaN
NaN 的值是 NaN(見 8.5)。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Infinity
Infinity 的值是 +∞(見 8.5)。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
undefined
undefined 的值是 undefined(見 8.1)。這個屬性擁有特性 <{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
全局對象的函數屬性
eval (x)
當用一個參數 x 調用 eval 函數,採用如下步驟:
- 如果 Type(x) 不是 String,返回 x。
- 令 prog 爲 ECMAScript 代碼,它是將 x 作爲一個程序解析的結果。如果解析失敗,拋出一個 SyntaxError 異常 ( 見 16 章 )。
- 令 evalCtx 爲給 eval 代碼 prog 建立的新執行環境 (10.4.2)。
- 令 result 爲解釋執行程序 prog 的結果。
- 退出執行環境 evalCtx,恢復到之前的執行環境。
- 如果 result.type 是 normal 並且其完結類型值是 V,則返回 V 值。
- 如果 result.type 是 normal 並且其完結類型值是 empty,則返回 undefined 值。
- 否則,result.type 必定是 throw。將 result.value 作爲異常拋出。
直接調用 Eval
一個 eval 函數的直接調用是表示爲符合以下兩個條件的 CallExpression:
解釋執行 CallExpression 中的 MemberExpression 的結果是個引用,這個引用擁有一個環境記錄項作爲其基值,並且這個引用的名稱是 "eval"。
以這個引用作爲參數調用 GetValue 抽象操作的結果是 15.1.2.1 定義的標準內置函數。
parseInt (string, radix)
parseInt 函數產生一個根據 radix 來解釋 string 得到的整數值。 string 開頭的空白會被忽略。如果 radix 是 undefined 或 0,則將 radix 當作 10 處理 ,除非數字是以字符對 0x 或 0X 開頭,在這種情形下將 radix 當作是 16。如果傳入的 radix 參數直接就是 16,那麼在數字前面加上 0x 或 0X 也無妨。
當調用 parseInt 函數時,採用以下步驟:
- 令 inputString 爲 ToString(string)。
- 令 S 爲一個新創建的子字符串,它由 inputString 的第一個非 StrWhiteSpaceChar 字符和它後面跟着的所有字符組成。( 換句話說,刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符,則令 S 爲空字符串。
- 令 sign 爲 1。
- 如果 S 不爲空並且 S 的第一個字符是減號 -,則令 sign 爲 −1。
- 如果 S 不是空並且 S 的第一個字符加號 + 或減號 -,則刪除 S 的第一個字符。
- 令 R = ToInteger(radix)。
- 令 stripPrefix 爲 true。
- 如果 R ≠ 0,則
- 否則,R = 0
- 如果 stripPrefix 是 true,則
- 如果 S 包含任何不是 R進制 數位的字符 ,則令 Z 爲 S 中這樣的字符之前的所有字符組成的子字符串;否則令 Z 爲 S 。
- 如果 Z 是空,返回 NaN。
- 令 mathInt 爲 Z 的 R進制 表示的數學值,用字母 A-Z 和 a-z 來表示 10 到 35 之間的值。( 但如果 R 是 10 並且 Z 包含多餘 20 位的值,可以替換 20 位後的每個數字爲 0,這是實現可選的功能;如果 R 不是 2、4、8、10、16、32,則 mathInt 可以是 Z 的 R進制 表示的依賴於實現的近似值。)
- 令 number 爲 mathInt 的 Number 值。
- 返回 sign × number。
parseFloat (string)
parseFloat 函數根據 string 參數的內容解釋爲十進制字面量的結果來決定,產生一個數值。
當調用 parseFloat 函數,採用以下步驟:
- 令 inputString 爲 ToString(string)。
- 令 trimmedString 爲一個新創建的子字符串,它由 inputString 的非 StrWhiteSpaceChar 字符的最左邊字符和它右邊跟着的所有字符組成。( 換句話說,刪掉前面的空白。) 如果 inputString 不包含任何這樣的字符,則令 trimmedString 爲空字符串。
- 如果 trimmedString 或 trimmedString 的任何前綴都不滿足 StrDecimalLiteral 的語法,返回 NaN。
- 令 numberString 爲滿足 StrDecimalLiteral 語法的 trimmedString 的最長前綴,可能是 numberString 自身。
- 返回 numberString 數學值的 Number 值。
isNaN (number)
如果指定參數爲 NaN,則返回 true,否則返回 false。
- 如果 ToString(number) 是 NaN,返回 true。
- 否則 ,返回 false。
isFinite (number)
如果指定參數爲 NaN 或 +∞或−∞,則返回 false,否則返回 true。
- 如果 ToNumber(number) 是 NaN 或 +∞ 或 −∞,返回 false。
- 否則,返回 true。
處理 URI 的函數屬性
統一資源標識符,或叫做 URI,是用來標識互聯網上的資源(例如,網頁或文件)和怎樣訪問這些資源的傳輸協議(例如,HTTP 或 FTP)的字符串。除了
15.1.3.1,
15.1.3.2,
15.1.3.3,15.1.3.4 說明的用來編碼和解碼 URI 的函數之外 ECMAScript 語言自身不提供任何使用 URL 的支持。
一個 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 - _ . ! ~ * ' ( )
當 URI 裏包含一個沒在上面列出的字符或有時不想讓給定的保留字符有特殊意義,那麼必須編碼這個字符。字符被轉換成 UTF-8 編碼,首先從 UTF-16 轉換成相應的代碼點值的替代。(注:對於 [0,127] 範圍的代碼單元,轉換到單字節時它們的值是相同的。)然後返回的字節序列轉換爲一個字符串,每個字節用一個“%xx”形式的轉移序列表示。
描述編碼和轉義過程的抽象操作 Encode 需要兩個字符串參數 string 和 unescapedSet。
- 令 strLen 爲 string 的字符個數。
- 令 R 爲空字符串。
- 令 k 爲 0。
- 重複
- 如果 k 等於 strLen,返回 R。
- 令 C 爲 string 中位置爲 k 的字符。
- 如果 C 在 unescapedSet 裏,則
- 令 S 爲一個只包含字符 C 的字符串。
- 令 R 爲之前 R 的值和 S 連接得到的一個新字符串值。
- 否則,C 不在 unescapedSet 裏
- 如果 C 的代碼單元值不小於 0xDC00 並且不大於 0xDFFF,則拋出一個 URIError 異常。
- 如果 C 的代碼單元值小於 0xD800 或大於 0xDBFF,則
- 令 V 爲 C 的代碼單元值。
- 否則
- k 遞增 1。
- 如果 k 等於 strLen,拋出一個 URIError 異常。
- 令 kChar 爲 string 的 k 位置的字符的代碼單元值。
- 如果 kChar 小於 0xDC00 或大於 0xDFFF,則拋出一個 URIError 異常。
- 令 V 爲 (((C的代碼單元值 ) – 0xD800) * 0x400 + (kChar – 0xDC00) + 0x10000)。
- 令 Octets 爲 V 執行 UTF-8 轉換的結果字節數組,令 L 爲這個字節數組的長度。
- 令 j 爲 0。
- 只要 j < L,就重複
- 令 jOctet 爲 Octets 的 j 位置的值。
- 令 S 爲一個包含三個字符“%XY”的字符串,這裏 XY 是編碼 jOctet 值的兩個大寫16進制數字。
- 令 R 爲之前 R 的值和 S 連接得到的一個新字符串值。
- j 遞增 1。
- k 遞增 1。
描述反轉義和解碼過程的抽象操作 Decode 需要兩個字符串參數 string 和
reservedSet。
- 令 strLen 爲 string 的字符個數。
- 令 R 爲空字符串。
- 令 k 爲 0。
- 重複
- 如果 k 等於 strLen,返回 R。
- 令 C 爲 string 的 k 位置的字符。
- 如果 C 不是‘%’,則
- 令 S 爲只包含字符 C 的字符串。
- 否則,C 是‘%’
- 令 start 爲 k。
- 如果 k + 2 大於或等於 strLen,拋出一個 URIError 異常。
- 如果 string 的 (k + 1) 和 (k + 2) 位置的字符沒有表示爲16進制數字,則拋出一個 URIError 異常。
- 令 B 爲 (k + 1) 和 (k + 2) 位置的兩個16進制數字表示的8位值。
- k 遞增 2.
- 如果 B 的最高有效位是 0,則
- 令 C 爲代碼單元值是 B 的字符。
- 如果 C 不在 reservedSet 裏,則
- 令 S 爲只包含字符 C 的字符串。
- 否則,C 在 reservedSet 裏
- 令 S 爲 string 的從位置 start 到位置 k 的子字符串。
- 否則,B 的最高有效位是 1
- 令 n 爲滿足 (B << n) & 0x80 等於 0 的最小非負數。
- 如果 n 等於 1 或 n 大於 4,拋出一個 URIError 異常。
- 令 Octets 爲一個長度爲 n 的字節數組。
- 將 B 放到 Octets 的 0 位置。
- 如果 k + (3 * (n – 1)) 大於或等於 strLen,拋出一個 URIError 異常。
- 令 j 爲 1。
- 重複,直到 j < n
- k 遞增 1。
- 如果 string 的 k 位置的字符不是‘%’,拋出一個 URIError 異常。
- 如果 string 的 (k + 1) 和 (k + 2) 位置的字符沒有表示爲16進制數字,拋出一個 URIError 異常。
- 令 B 爲 string 的 (k + 1') 和 (k + 2) 位置的兩個16進制數字表示的8位值。
- 如果 B 的兩個最高有效位不是二進制的 10,拋出一個 URIError 異常。
- k 遞增 2。
- 將 B 放到 Octets 的 j 位置。
- j 遞增 1。
- 令 V 爲給 Octets 執行 UTF-8 轉換得到的值,這是從一個字節數組到一個21位值的轉換過程。如果 Octets 不包含有效的 UTF-8 編碼的 Unicode 代碼點,則拋出一個 URIError 異常。
- 如果 V 小於 0x10000,則
- 令 C 爲代碼單元值是 V 的字符。
- 如果 C 不在 reservedSet 裏,則
- 令 S 爲只包含字符 C 的字符串。
- 否則,C 在 reservedSet 裏
- 令 S 爲 string 的從位置 start 到位置 k 的子字符串。
- 否則,V ≥ 0x10000
- 令 L 爲 (((V – 0x10000) & 0x3FF) + 0xDC00)。
- 令 H 爲 ((((V – 0x10000) >> 10) & 0x3FF) + 0xD800)。
- 令 S 爲代碼單元值是 H 和 L 的兩個字符組成的字符串。
- 令 R 爲之前的 R 和 S 連接成的新字符串。
- k 遞增 1。
在 UTF-8 中,用 1 到 6 個位的字節序列來編碼字符。只有“序列”中高階位設置爲 0 的字節,其餘的 7 位才用於編碼字符值。在一個 n 個字節的序列中,n > 1,初始字節有 n 個設置爲 1 的高階位,其後的一位設置爲 0。這個字節的其它位包含了字符編碼的位。隨後的其它字節都是最高位爲 1、次高位爲 0、剩下的 6 位爲字符編碼。表21 指定了 ECMAScript 字符可能的 UTF-8 編碼。
單位代碼值 | 表現 | 第一字節 | 第二字節 | 第三字節 | 第四字節 |
---|---|---|---|---|---|
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位值中。這就是替代符對的解碼方式。
RFC 3629 禁止對無效 UTF-8 字節序列的解碼。例如,無效序列 C0 80 不能解碼成字符 U+0000。當 Decode 算法的實現遇到這樣的無效序列必須拋出一個 URIError 異常。
decodeURI (encodedURI)
decodeURI 函數計算出一個新版 URI,將 URI 中可能是 encodeURI 函數引入的每個轉義序列和 UTF-8 編碼組替換爲代表它們的字符。不是 encodeURI 導入的轉義序列不會被替換。
當以一個參數 encodedURI 調用 decodeURI 函數,採用如下步驟:
- 令 uriString 爲 ToString(encodedURI)。
- 令 reservedURISet 爲一個包含 uriReserved 中的所有字符組成的字符串連接上 "#" 組成的字符串。
- 返回調用 Decode(uriString, reservedURISet) 的結果。
decodeURIComponent (encodedURIComponent)
decodeURIComponent 函數計算出一個新版 URI,將 URI 中可能是 encodeURIComponent 函數引入的每個轉義序列和 UTF-8 編碼組替換爲代表它們的字符。
當以一個參數 encodedURIComponent 調用 decodeURIComponent 函數,採用如下步驟:
- 令 componentString 爲 ToString(encodedURIComponent)。
- 令 reservedURIComponentSet 爲一個空字符串。
- 返回調用 Decode(componentString, reservedURIComponentSet) 的結果。
encodeURI (uri)
encodeURI 函數計算出一個新版 URI,將 URI 中某些字符的每個實例替換爲代表這些字符 UTF-8 編碼的一個,兩個或三個轉義序列。
當以一個參數 uri 調用 encodeURI 函數,採用如下步驟:
- 令 uriString 爲 ToString(uri)。
- 令 unescapedURISet 爲一個包含 uriReserved 和 uriUnescaped 中所有字符組成的字符串連接上 "#" 組成的字符串。
- 返回調用 Encode(uriString, unescapedURISet) 的結果。
encodeURIComponent (uriComponent)
encodeURIComponent 函數計算出一個新版 URI,將 URI 中某些字符的每個實例替換爲代表這些字符 UTF-8 編碼的一個,兩個或三個轉義序列。
當以一個參數 uriComponent 調用 encodeURIComponent 函數,採用如下步驟:
- 令 componentString 爲 ToString(uriComponent)。
- 令 unescapedURIComponentSet 爲一個包含 uriUnescaped 中所有字符組成的字符串。
- 返回調用 Encode(componentString, unescapedURIComponentSet) 的結果。
全局對象的構造器屬性
Object ( . . . )
Function ( . . . )
Array ( . . . )
String ( . . . )
Boolean ( . . . )
Number ( . . . )
Date ( . . . )
見
15.9.2.
RegExp ( . . . )
Error ( . . . )
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 函數,採用如下步驟:
- 如果 value 是 null、undefined 或未指定,則創建並返回一個新 Object 對象,這個對象與彷彿用相同參數調用標準內置的 Object 構造器 (15.2.2.1) 的結果一樣。
- 返回 ToObject(value)。
Object 構造器
當 Object 是 new 表達式調用的一部分時,它是一個構造器,可創建一個對象。
new Object ( [ value ] )
當以一個參數 value 或者無參數調用 Object 構造器,採用如下步驟:
- 如果提供了 value,則
- 斷言:未提供參數 value 或其類型是 Null 或 Undefined。
- 令 obj 爲一個新創建的原生 ECMAScript 對象。
- 設定 obj 的 [[Prototype]] 內部屬性爲標準內置的 Object 的 prototype 對象 (15.2.4)。
- 設定 obj 的 [[Class]] 內部屬性爲 "Object"。
- 設定 obj 的 [[Extensible]] 內部屬性爲 true。
- 設定 obj 的 8.12 指定的所有內部方法
- 返回 obj。
Object 構造器的屬性
Object 構造器的 [[Prototype]] 內部屬性值是標準內置 Function 的 prototype 對象。
除了內部屬性和 length 屬性(其值是 1)之外,Object 構造器擁有以下屬性:
Object.prototype
Object.prototype 的初始值是標準內置 Object 的 prototype 對象(15.2.4)。
這個屬性包含特性 {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
Object.getPrototypeOf ( O )
當以參數 O 調用 getPrototypeOf 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 返回 O 的 [[Prototype]] 內部屬性的值。
Object.getOwnPropertyDescriptor ( O, P )
當調用 getOwnPropertyDescriptor 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 令 name 爲 ToString(P)。
- 令 desc 爲以參數 name 調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 返回調用 FromPropertyDescriptor(desc) 的結果。
Object.getOwnPropertyNames ( O )
當調用 getOwnPropertyNames 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 令 array 爲彷彿是用表達式 new Array () 創建新對象的結果,這裏的 Array 是標準內置構造器名。
- 令 n 爲 0。
- 對 O 的每個自身屬性 P
- 令 name 爲值是 P 的名稱的字符串。
- 以 ToString(n) 和屬性描述 {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 爲參數調用 array 的 [[DefineOwnProperty]] 內部方法。
- n 遞增 1。
- 返回 array。
Object.create ( O [, Properties] )
create 函數按照指定的原型創建一個新對象。當調用 create 函數,採用如下步驟:
- 如果 Type(O) 不是 Object 或 Null,則拋出一個 TypeError 異常。
- 令 obj 爲彷彿是用表達式 new Object() 創建新對象的結果,這裏的 Object 是標準內置構造器名。
- 設定 obj 的 [[Prototype]] 內部屬性爲 O。
- 如果傳入了 Properties 參數並且不是 undefined,則彷彿是用 obj 和 Properties 當作參數調用標準內置函數 Object.defineProperties 一樣給 obj 添加自身屬性。
- 返回 obj。
Object.defineProperty ( O, P, Attributes )
defineProperty 函數用於給一個對象添加一個自身屬性以及更新現有自身屬性的特性。當調用 defineProperty 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 令 name 爲 ToString(P)。
- 令 desc 爲以 Attributes 作爲參數調用 ToPropertyDescriptor 的結果。
- 以 name、desc、true 作爲參數調用 O 的 [[DefineOwnProperty]] 內部方法 .
- 返回 O。
Object.defineProperties ( O, Properties )
defineProperties 函數用於給一個對象添加一些自身屬性以及更新現有的一些自身屬性的特性。當調用 defineProperties 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 令 props 爲 ToObject(Properties)。
- 令 names 爲一個內部列表,它包含 props 的每個可遍歷自身屬性的名稱。
- 令 descriptors 爲一個空的內部列表。
- 對 names 的每個元素 P,按照列表順序 ,
- 令 descObj 爲以 P 作爲參數調用 props 的 [[Get]] 內部方法的結果。
- 令 desc 爲以 descObj 作爲參數調用 ToPropertyDescriptor 的結果。
- 將 desc 插入 descriptors 的尾部。
- 對 descriptors 的每個元素 desc,按照列表順序 ,
- 以參數 P、desc、true 調用 O 的 [[DefineOwnProperty]] 內部方法。
- 返回 O
如果一個實現爲 for-in 語句 的定義了特定的枚舉順序,那麼在這個算法的 第3步 中的列表元素必須也用相同的順序排列。
Object.seal ( O )
當調用 seal 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 對 O 的每個命名自身屬性名 P,
- 令 desc 爲以參數 P 調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 如果 desc.[[Configurable]] 是 true,設定 desc.[[Configurable]] 爲 false。
- 以 P、desc、true 爲參數調用 O 的 [[DefineOwnProperty]] 內部方法。
- 設定 O 的 [[Extensible]] 內部屬性爲 false。
- 返回 O。
Object.freeze ( O )
當調用 freeze 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 對 O 的每個命名自身屬性名 P,
- 令 desc 爲以參數 P 調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 如果
IsDataDescriptor(desc) 是 true,則
- 如果 desc.[[Writable]] 是 true,設定 desc。[[Writable]] 爲 false.
- 如果 desc.[[Configurable]] 是 true,設定 desc。[[Configurable]] 爲 false。
- 以 P、desc、true 作爲參數調用 O 的 [[DefineOwnProperty]] 內部方法。
- 設定 O 的 [[Extensible]] 內部屬性爲 false。
- 返回 O。
Object.preventExtensions ( O )
當調用 preventExtensions 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常 .
- 設定 O 的 [[Extensible]] 內部屬性爲 false。
- 返回 O。
Object.isSealed ( O )
當以參數 O 調用 isSealed 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 對 O 的每個命名自身屬性名 P,
- 令 desc 爲以參數 P 調用 O 的 [[GetOwnProperty]] 內部方法的結果 .
- 如果 desc.[[Configurable]] 是 true,則返回 false。
- 如果 O 的 [[Extensible]] 內部屬性是 false,則返回 true。
- 否則,返回 false。
Object.isFrozen ( O )
當以參數 O 調用 isFrozen 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 對 O 的每個命名自身屬性名 P,
- 令 desc 爲以參數 P 調用 O 的 [[GetOwnProperty]] 內部方法的結果 .
- 如果
IsDataDescriptor(desc) 是 true,則
- 如果 desc.[[Writable]] 是 true,則返回 false。
- 如果 desc.[[Configurable]] 是 true,則返回 false。
- 如果 O 的 [[Extensible]] 內部屬性是 false,則返回 true。
- 否則,返回 false。
Object.isExtensible ( O )
當以參數 O 調用 isExtensible 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 返回 O 的 [[Extensible]] 內部屬性布爾值。
Object.keys ( O )
當以參數 O 調用 keys 函數,採用如下步驟:
- 如果 Type(O) 不是 Object,則拋出一個 TypeError 異常。
- 令 n 爲 O 的可遍歷自身屬性的個數
- 令 array 爲彷彿是用表達式 new Array() 創建新對象的結果,這裏的 Array 是標準內置構造器名。
- 令 index 爲 0。
- 對 O 的每個可遍歷自身屬性名 P,
- 以 ToString(index),屬性描述 {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},和 false 作爲參數調用 array 的 [[DefineOwnProperty]] 內部方法。
- index 遞增 1。
- 返回 array。
如果一個實現爲 for-in 語句 的定義了特定的枚舉順序,那麼在這個算法的 第5步 中的必須使用相同的枚舉順序。
Object 的 prototype 對象的屬性
Object 的 prototype 對象的 [[Prototype]] 內部屬性的值是 null ,[[Class]] 內部屬性的值是 "Object",[[Extensible]] 內部屬性的初始值是 true。
Object.prototype.constructor
Object.prototype.constructor 的初始值是標準內置的 Object 構造器。
Object.prototype.toString ( )
當調用 toString 方法,採用如下步驟:
- 如果 this 的值是 undefined,返回 "[object Undefined]"。
- 如果 this 的值是 null,返回 "[object Null]"。
- 令 O 爲以 this 作爲參數調用 ToObject 的結果。
- 令 class 爲 O 的 [[Class]] 內部屬性的值。
- 返回三個字符串 "[object "、class 和 "]" 連起來的字符串。
Object.prototype.toLocaleString ( )
當調用 toLocaleString 方法,採用如下步驟:
- 令 O 爲以 this 作爲參數調用 ToObject 的結果。
- 令 toString 爲以 "toString" 作爲參數調用 O 的 [[Get]] 內部方法的結果.
- 如果 IsCallable(toString) 是 false,拋出一個 TypeError 異常。
- 返回以 O 作爲 this 值,無參數調用 toString 的 [[Call]] 內部方法的結果。
Object.prototype.valueOf ( )
當調用 valueOf 方法,採用如下步驟:
- 令 O 爲以 this 作爲參數調用 ToObject 的結果。
- 如果 O 是以一個宿主對象 (15.2.2.1) 爲參數調用
Object 構造器的結果,則
- 返回 O 或返回先前傳遞給構造器的原宿主對象。返回的具體結果是由實現定義的。
- 返回 O。
Object.prototype.hasOwnProperty (V)
當以參數 V 調用 hasOwnProperty 方法,採用如下步驟:
- 令 P 爲 ToString(V)。
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 desc 爲以 P 爲參數調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 如果 desc 是 undefined,返回 false。
- 返回 true。
Object.prototype.isPrototypeOf (V)
當以參數 V 調用 isPrototypeOf 方法,採用如下步驟:
- 如果 V 不是個對象,返回 false。
- 令 O 爲以 this 作爲參數調用 ToObject 的結果。
- 重複
- 令 V 爲 V 的 [[Prototype]] 內部屬性的值。
- 如果 V 是 null,返回 false
- 如果 O 和 V 指向同一個對象,返回 true。
Object.prototype.propertyIsEnumerable (V)
當以參數 V 調用 propertyIsEnumerable 方法,採用如下步驟:
- 令 P 爲 ToString(V)。
- 令 O 爲以 this 作爲參數調用 ToObject 的結果。
- 令 desc 爲以 P 作爲參數調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 如果 desc 是 undefined,返回 false。
- 返回 desc.[[Enumerable]] 的值。
Object 的實例的屬性
Object 的實例除了擁從 Object 的 prototype 對象繼承來的屬性之外不包含特殊的屬性。
Function 對象
作爲函數調用 Function 構造器
當將 Function 作爲函數來調用,而不是作爲構造器,它會創建並初始化一個新函數對象。所以函數調用 Function(…) 與用相同參數的 new Function(…) 表達式創建的對象相同。
Function (p1, p2, … , pn, body)
當以 p1、p2、…、pn 和 body 作爲參數調用 Function 函數(這裏的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),採用如下步驟:
- 創建並返回一個新函數對象,它彷彿是用相同參數給標準內置構造器 Function (15.3.2.1). 用一個 new 表達式創建的。
Function 構造器
當 Function 作爲 new 表達式的一部分被調用時,它是一個構造器:它初始化新創建的對象。
new Function (p1, p2, … , pn, body)
最後一個參數指定爲函數的 body(可執行代碼);之前的任何參數都指定爲形式參數。
當以 p1、p2、…、pn 和 body 作爲參數調用 Function 構造器(這裏的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),採用如下步驟:
- 令 argCount 爲傳給這個函數調用的參數總數。
- 令 P 爲空字符串。
- 如果 argCount = 0,令 body 爲空字符串。
- 否則如果 argCount = 1,令 body 爲那個參數。
- 否則,argCount > 1
- 令 body 爲 ToString( body )。
- 如果 P 不可解析爲一個 FormalParameterList,則拋出一個 SyntaxError 異常。
- 如果 body 不可解析爲 FunctionBody,則拋出一個 SyntaxError 異常。
- 如果 body 是嚴格模式代碼 ( 見 10.1.1),則令 strict 爲 true,否則令 strict 爲 false。
- 如果 strict 是 true,適用 13.1 指定拋出的任何異常。
- 返回一個新創建的函數對象,它是依照 13.2 專遞 P 作爲 FormalParameterList、body 作爲 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]] 內部屬性值是標準內置 Function 的 prototype 對象 (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 對象的屬性
Function 的 prototype 對象自身是一個函數對象 ( 它的 [[Class]] 是 "Function"),調用這個函數對象時,接受任何參數並返回 undefined。
Function 的 prototype 對象的 [[Prototype]] 內部屬性值是標準內置 Object 的 prototype 對象 (15.2.4)。Function 的 prototype 對象的 [[Extensible]] 內部屬性的初始值是 true。
Function 的 prototype 對象自身沒有 valueOf 屬性 ; 但是,它從 Object 的 prototype 對象繼承了 valueOf 屬性。
Function 的 prototype 對象的 length 屬性是 0。
Function.prototype.constructor
Function.prototype.constructor 的初始值是內置 Function 構造器。
Function.prototype.toString ( )
此函數的返回值的表示是依賴於實現的。這個表示包含 FunctionDeclaration 的語法。特別注意,怎樣在這個字符串表示中使用和放置空白、行終止符、分號,是依賴於實現的。
這個 toString 不是通用的;如果它的 this 值不是一個函數對象,它會拋出一個 TypeError 異常。因此,它不能當做方法來轉移到其他類型的對象中。
Function.prototype.apply (thisArg, argArray)
當以 thisArg 和 argArray 爲參數在一個 func 對象上調用 apply 方法,採用如下步驟:
- 如果 IsCallable( func ) 是 false,則拋出一個 TypeError 異常。
- 如果 argArray 是 null 或 undefined,則
- 返回提供 thisArg 作爲 this 值並以空參數列表調用 func 的 [[Call]] 內部方法的結果。
- 如果 Type( argArray ) 不是 Object,則拋出一個 TypeError 異常。
- 令 len 爲以 "length" 作爲參數調用 argArray 的 [[Get]] 內部方法的結果。
- 令 n 爲 ToUint32( len )。
- 令 argList 爲一個空列表。
- 令 index 爲 0。
- 只要 index < n 就重複
- 提供 thisArg 作爲 this 值並以 argList 作爲參數列表,調用 func 的 [[Call]] 內部方法,返回結果。
apply 方法的 length 屬性是 2。
Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
當以 thisArg 和可選的 arg1、arg2 等等作爲參數在一個 func 對象上調用 call 方法,採用如下步驟:
- 如果 IsCallable(func) 是 false,則拋出一個 TypeError 異常。
- 令 argList 爲一個空列表。
- 如果調用這個方法的參數多餘一個,則從 arg1 開始以從左到右的順序將每個參數插入爲 argList 的最後一個元素。
- 提供 thisArg 作爲 this 值並以 argList 作爲參數列表,調用 func 的 [[Call]] 內部方法,返回結果。
call 方法的 length 屬性是 1。
Function.prototype.bind (thisArg [, arg1 [, arg2, …]])
bind 方法需要一個或更多參數,thisArg 和(可選的)arg1、arg2,等,執行如下步驟返回一個新函數對象:
- 令 Target 爲 this 值 .
- 如果 IsCallable( Target ) 是 false,拋出一個 TypeError 異常 .
- 令 A 爲一個(可能爲空的)新內部列表,它包含按順序的 thisArg 後面的所有參數(arg1、arg2,等)。
- 令 F 爲一個新原生 ECMAScript 對象。
- 依照 8.12 指定,設定 F 的除了 [[Get]] 之外的所有內部方法。
- 依照 15.3.5.4 指定,設定 F 的 [[Get]] 內部屬性。
- 設定 F 的 [[TargetFunction]] 內部屬性爲 Target。
- 設定 F 的 [[BoundThis]] 內部屬性爲 thisArg 的值。
- 設定 F 的 [[BoundArgs]] 內部屬性爲 A。
- 設定 F 的 [[Class]] 內部屬性爲 "Function"。
- 設定 F 的 [[Prototype]] 內部屬性爲 15.3.3.1 指定的標準內置 Function 的 prototype 對象。
- 依照 15.3.4.5.1 描述,設定 F 的 [[Call]] 內置屬性。
- 依照 15.3.4.5.2 描述,設定 F 的 [[Construct]] 內置屬性。
- 依照 15.3.4.5.3 描述,設定 F 的 [[HasInstance]] 內置屬性。
- 如果 Target 的 [[Class]] 內部屬性是 "Function",則
- 否則設定 F 的 length 自身屬性爲 0.
- 設定 F 的 length 自身屬性的特性爲 15.3.5.1 指定的值。
- 設定 F 的 [[Extensible]] 內部屬性爲 true。
- 令 thrower 爲 [[ThrowTypeError]] 函數對象 (13.2.3)。
- 以 "caller", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作爲參數調用 F 的 [[DefineOwnProperty]] 內部方法。
- 以 "arguments", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作爲參數調用 F 的 [[DefineOwnProperty]] 內部方法。
- 返回 F.
bind 方法的 length 屬性是 1。
[[Call]]
當調用一個用 bind 函數創建的函數對象 F 的 [[Call]] 內部方法,傳入一個 this 值和一個參數列表 ExtraArgs,採用如下步驟:
- 令 boundArgs 爲 F 的 [[BoundArgs]] 內部屬性值。
- 令 boundThis 爲 F 的 [[BoundThis]] 內部屬性值。
- 令 target 爲 F 的 [[TargetFunction]] 內部屬性值。
- 令 args 爲一個新列表,它包含與列表 boundArgs 相同順序相同值,後面跟着與 ExtraArgs 是相同順序相同值。
- 提供 boundThis 作爲 this 值,提供 args 爲參數調用 target 的 [[Call]] 內部方法,返回結果。
[[Construct]]
當調用一個用 bind 函數創建的函數對象 F 的 [[Construct]] 內部方法,傳入一個參數列表 ExtraArgs,採用如下步驟:
- 令 target 爲 F 的 [[TargetFunction]] 內部屬性值。
- 如果 target 不包含 [[Construct]] 內部方法,拋出一個 TypeError 異常。
- 令 boundArgs 爲 F 的 [[BoundArgs]] 內部屬性值。
- 令 args 爲一個新列表,它包含與列表 boundArgs 相同順序相同值,後面跟着與 ExtraArgs 是相同順序相同值。
- 提供 args 爲參數調用 target 的 [[Construct]] 內部方法,返回結果。
[[HasInstance]] (V)
當調用一個用 bind 函數創建的函數對象 F 的 [[HasInstance]] 內部方法,並以 V 作爲參數,採用如下步驟:
- 令 target 爲 F 的 [[TargetFunction]] 內部屬性值。
- 如果 target 不包含 [[HasInstance]] 內部方法,拋出一個 TypeError 異常。
- 提供 V 爲參數調用 target 的 [[HasInstance]] 內部方法,返回結果。
Function 的實例的屬性
除了必要的內部屬性之外,每個函數實例還有一個 [[Class]] 內部屬性並且在大多數情況下使用不同版本的 [[Call]] 內部屬性。函數實例根據怎樣創建的(見 8.6.2、13.2、15、15.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 實現不得爲在嚴格模式函數代碼裏訪問這些屬性關聯任何依賴實現的特定行爲。
length
length 屬性值是個整數,它指出函數預期的“一般的”參數個數。然而,語言允許用其他數量的參數來調用函數。當以與函數的 length 屬性指定的數量不同的參數個數調用函數時,它的行爲依賴於函數自身。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
prototype
prototype 屬性的值用於初始化一個新創建對象的的 [[Prototype]] 內部屬性,爲了這個新創建對象要先將函數對象作爲構造器調用。這個屬性擁有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。
[[HasInstance]] (V)
設 F 是個函數對象。當以 V 作爲參數調用 F 的 [[HasInstance]] 內部方法,採用如下步驟:
- 如果 V 不是個對象,返回 false。
- 令 O 爲用屬性名 "prototype" 調用 F 的 [[Get]] 內部方法的結果。
- 如果 Type(O) 不是 Object,拋出一個 TypeError 異常。
- 重複
- 令 V 爲 V 的 [[Prototype]] 內部屬性值。
- 如果 V 是 null,返回 false。
- 如果 O 和 V 指向相同對象,返回 true。
[[Get]] (P)
函數對象與其他原生 EMACScript 對象 (8.12.3) 用不同的 [[Get]] 內部方法。
設 F 是一個函數對象,當以屬性名 P 調用 F 的 [[Get]] 內部方法,採用如下步驟:
- 令 v 爲傳入 P 作爲屬性名參數調用 F 的默認 [[Get]] 內部方法 (8.12.3) 的結果。
- 如果 P 是 "caller" 並且 v 是個嚴格模式函數對象,拋出一個 TypeError 異常。
- 返回 v。
Array 對象
數組對象會給予一些特定種類的屬性名特殊待遇。對一個屬性名 P(字符串形式),當且僅當 ToString(ToUint32(P)) 等於 P 並且 ToUint32(P) 不等於 232 - 1 時,它是個數組索引。一個屬性名是數組索引的屬性還叫做元素 。所有數組對象都有一個 length 屬性,其值始終是一個小於 232 的非負整數。length 屬性值在數值上比任何名爲數組索引的屬性名稱還要大;每當創建或更改一個數組對象的屬性,都要調整其他屬性以保持上面那個條件不變。具體來說,每當添加一個名爲數組索引的屬性時,如果需要就更改 length 屬性爲在數值上比這個數組索引大 1 的值;每當更改 length 屬性,所有屬性名是數組索引並且其值不小於新 length 的屬性會被自動刪除。 這個限制只應用於數組對象的自身屬性,並且從原型中繼承的 length 或數組索引不影響這個限制。
對一個對象 O,如果以下算法返回 true,那麼就叫這個對象爲 稀疏 的:
- 令 len 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 對每個範圍在 0 ≤ i <
ToUint32(len) 的整數 i
- 令 elem 爲以 ToString(i) 作爲參數調用 O 的 [[GetOwnProperty]] 內部方法的結果。
- 如果 elem 是 undefined,返回 true。
- 返回 false。
作爲函數調用 Array 構造器
當將 Array 作爲函數來調用,而不是作爲構造器,它會創建並初始化一個新數組對象。所以函數調用 Array(…) 與用相同參數的 new Array(…) 表達式創建的對象相同。
Array ( [ item1 [ , item2 [ , … ] ] ] )
當調用 Array 函數,採用如下步驟:
- 創建並返回一個新函數對象,它彷彿是用相同參數給標準內置構造器 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 異常。
如果參數 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。採用如下步驟:
數組原型對象的屬性
數組原型對象的
[[Prototype]] 內部屬性值是標準內置
Object 原型對象 (15.2.4)。
數組原型對象自身是個數組;它的 [[Class]] 是 "Array",它擁有一個 length 屬性(初始值是 +0)和 15.4.5.1 描述的特殊的 [[DefineOwnProperty]] 內部方法。
在以下的對數組原型對象的屬性函數的描述中,短語“this 對象”指的是調用這個函數時的 this 值對象。允許 this 是 [[Class]] 內部屬性值不是 "Array" 的對象。
Array.prototype.constructor
Array.prototype.constructor 的初始值是標準內置 Array 構造器。
Array.prototype.toString ( )
- 令 array 爲用 this 值調用 ToObject 的結果。
- 令 func 爲以 "join" 作爲參數調用 array 的 [[Get]] 內部方法的結果。
- 如果 IsCallable(func) 是 false,則令 func 爲標準內置方法 Object.prototype.toString (15.2.4.2)。
- 提供 array 作爲 this 值並以空參數列表調用 func 的 [[Call]] 內部方法,返回結果。
Array.prototype.toLocaleString ( )
先用數組元素的 toLocaleString 方法,將他們轉換成字符串。然後將這些字符串串聯,用一個分隔符分割,這裏的分隔符字符串是與特定語言環境相關,由實現定義的方式得到的。調用這個函數的結果除了與特定語言環境關聯之外,與 toString 的結果類似。
- 令 array 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 arrayLen 爲以 "length" 作爲參數調用 array 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(arrayLen)。
- 令 separator 爲宿主環境的當前語言環境對應的列表分隔符字符串(這是實現定義的方式得到的)。
- 如果 len 是零,返回空字符串。
- 令 firstElement 爲以 "0" 作爲參數調用 array 的 [[Get]] 內部方法的結果。
- 如果 firstElement 是 undefined 或 null,則
- 否則
- 令 elementObj 爲 ToObject(firstElement).
- 令 func 爲以 "toLocaleString" 作爲參數調用 elementObj 的 [[Get]] 內部方法的結果。
- 如果 IsCallable(func) 是 false,拋出一個 TypeError 異常。
- 令 R 爲提供 elementObj 作爲 this 值並以空參數列表調用 func 的 [[Call]] 內部方法的結果。
- 令 k 爲 1。
- 只要 k < len 就重複
- 令 S 爲串聯 R 和 separator 產生的字符串。
- 令 nextElement 爲以 ToString(k) 作爲參數調用 array 的 [[Get]] 內部方法的結果。
- 如果 nextElement 是 undefined 或 null,則
- 令 R 爲空字符串。
- 否則
- 令 elementObj 爲 ToObject(nextElement).
- 令 func 爲以 "toLocaleString" 作爲參數調用 elementObj 的 [[Get]] 內部方法的結果。
- 如果 IsCallable(func) 是 false,拋出一個 TypeError 異常。
- 令 R 爲提供 elementObj 作爲 this 值並以空參數列表調用 func 的 [[Call]] 內部方法的結果。
- 令 R 爲串聯 S 和 R 產生的字符串。
- k 遞增 1。
- 返回 R
Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
當以零個或更多個參數 item1、item2,等,調用 concat 方法時,會返回一個數組。 返回的數組包含 調用對象的數組元素 和隨後順序每個參數的數組元素。
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 A 爲彷彿是用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
- 令 n 爲 0。
- 令 items 爲一個內部列表,他的第一個元素是 O,之後的元素是調用時傳給這個函數的各參數(以從左到右的順序)。
- 只要 items 不是空就重複
- 刪除 items 的第一個元素,並令 E 爲這個元素值。
- 如果 E 的
[[Class]] 內部屬性是 "Array",則
- 令 k 爲 0。
- 令 len 爲以 "length" 爲參數調用 E 的 [[Get]] 內部方法的結果。
- 只要 k < len 就重複
- 令 P 爲 ToString(k).
- 令 exists 爲以 P 作爲參數調用 E 的 [[HasProperty]] 內部方法的結果。
- 如果 exists 是 true,則
- 令 subElement 爲以 P 作爲參數調用 E 的 [[Get]] 內部方法的結果。
- 以 ToString(n)、屬性描述符 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- n 遞增 1。
- k 遞增 1。
- 否則,E 不是數組
- 以 ToString(n)、屬性描述符 { [[Value]]: E, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- n 遞增 1。
- 返回 A。
concat 方法的 length 屬性是 1。
Array.prototype.join (separator)
數組元素先被轉換爲字符串,再將這些字符串用 separator 分割連接在一起。如果沒提供分隔符,將一個逗號用作分隔符。
join 方法需要一個參數 separator,執行以下步驟 :
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 如果 separator 是 undefined,令 separator 爲單字符字符串 ","。
- 令 sep 爲 ToString(separator)。
- 如果 len 是零,返回空字符串。
- 令 element0 爲以 "0" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 如果 element0 是 undefined 或 null, 令 R 爲空字符串;否則,令 R 爲 ToString(element0)。
- 令 k 爲 1.
- 只要 k < len 就重複
- 返回 R。
join 方法的 length 屬性是 1。
Array.prototype.pop ( )
刪除並返回數組的最後一個元素。
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 如果 len 是零
- 以 "length"、0 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 undefined。
- 否則,len > 0
- 令 indx 爲 ToString(len - 1)。
- 令 element 爲以 indx 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 以 indx 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- 以 "length"、indx 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 element。
Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
將參數以他們出現的順序追加到數組末尾。數組的新 length 屬性值會作爲調用的結果返回。
當以零或更多個參數 item1、item2,等,調用 push 方法,採用以下步驟:
- 令 O 爲以 this 值作爲參數調用 ToString 的結果。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 n 爲 ToUint32(lenVal)。
- 令 items 爲一個內部列表,它的元素是調用這個函數時傳入的參數(從左到右的順序)。
- 只要 items 不是空就重複
- 以 "length"、n 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 n。
push 方法的 length 屬性是 1。
Array.prototype.reverse ( )
重新排列數組元素,以翻轉它們的順序。對象會被當做調用的結果返回。
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 令 middle 爲 floor(len / 2)。
- 令 lower 爲 0。
- 只要 lower ≠ middle 就重複
- 令 upper 爲 len - lower - 1。
- 令 upperP 爲 ToString(upper)。
- 令 lowerP 爲 ToString(lower)。
- 令 lowerValue 爲以 lowerP 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 upperValue 爲以 upperP 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 lowerExists 爲以 lowerP 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 令 upperExists 爲以 upperP 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 lowerExists 是 true 並且 upperExists 是 true,則
- 否則如果 lowerExists 是 false 並且 upperExists 是
true,則
- 以 lowerP、upperValue 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 以 upperP 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- 否則如果 lowerExists 是 true 並且 upperExists 是
false,則
- 以 lowerP 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- 以 upperP、lowerValue 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 否則,lowerExists 和 upperExists 都是 false
- 不需要做任何事情。
- lower 遞增 1。
- 返回 O。
Array.prototype.shift ( )
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 如果 len 是零 , 則
- 以 "length"、0 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 undefined。
- 令 first 爲以 "0" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 k 爲 1。
- 只要 k < len 就重複
- 令 from 爲 ToString(k)。
- 令 to 爲 ToString(k - 1)。
- 令 fromPresent 爲以 from 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 fromPresent 是 true, 則
- 否則,fromPresent 是 false
- 以 to 和 ture 作爲參數調用 O 的 [[Delete]] 內部方法。
- k 遞增 1。
- 以 ToString(len - 1) 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- 以 "length"、(len - 1) 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 first。
Array.prototype.slice (start, end)
slice 方法需要 start 和 end 兩個參數,返回一個數組,這個數組包含從下標爲 start 的元素到下標爲 end(不含 end)的元素(或如果 end 是 undefined 就到數組末尾)。如果 start 爲負,它會被當做是 length + start,這裏的 length 是數組長度。如果 end 爲負,它會被當做是 length + end,這裏的 length 是數組長度。採用如下步驟:
- 令 O 爲以 this 值作爲參數調用 ToObject 的結果。
- 令 A 爲彷彿用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
- 令 lenVal 爲以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 令 relativeStart 爲 ToInteger(start)。
- 如果 relativeStart 爲負,令 k 爲 max((len + relativeStart), 0);否則令 k 爲 min(relativeStart, len)。
- 如果 end 是 undefined,令 relativeEnd 爲 len;否則令 relativeEnd 爲 ToInteger(end)。
- 如果 relativeEnd 爲負,令 final 爲 max((len + relativeEnd), 0);否則令 final 爲 min(relativeEnd, len)。
- 令 n 爲 0。
- 只要 k < final 就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true, 則
- 令 kValue 爲以 Pk 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 以 ToString(n)、屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- k 遞增 1。
- n 遞增 1。
- 返回 A。
slice 方法的 length 屬性是 2。
Array.prototype.sort (comparefn)
給 this 數組的元素排序。排序不一定是穩定的(相等的元素們不一定按照他們原來的順序排列)。如果 comparefn 不是 undefined,它就必須是個函數,這個函數接受兩個參數 x 和 y,如果 x < y 返回一個負值,如果 x = y 返回零,如果 x > y 返回一個正值。
令 obj 爲以 this 值作爲參數調用 ToObject 的結果。
以 "length" 作爲參數調用 obj 的 [[Get]] 內部方法,將結果作爲參數調用 Uint32,令 len 爲返回的結果。
如果 comparefn 不是 undefined 並且不是對 this 數組的元素保持一致的比較函數(見下面),那麼這種情況下 sort 的行爲是由實現來定義的。
令 proto 爲 obj 的 [[Prototype]] 內部屬性。如果 proto 不是 null 並且存在一個整數 j 滿足下面列出的全部條件,那麼這種情況下 sort 的行爲是實現定義的:
- obj 是稀疏的(15.4)
- 0 ≤ j < len
- 以 ToString(j) 作爲參數調用 proto 的 [[HasProperty]] 內部方法的結果是 true
如果 obj 是稀疏的並且以下任何條件爲真,那麼這種情況下 sort 的行爲也是實現定義的:
- obj 的 [[Extensible]] 內部屬性是 false。
- 任何名爲小於 len 的非負整數的數組索引屬性中,有 [[Configurable]] 特性是 false 的數據屬性。
任何名爲小於 len 的非負整數的數組索引屬性中,有訪問器屬性,或有 [[Writable]] 特性是 false 的數據屬性,那麼這種情況下 sort 的行爲也是實現定義的。
否則,採用如下步驟。
- 根據實現定義的排序算法,通過調用若干次 obj 的 [[Get]]、[[Put]]、[[Delete]] 內部方法和 SortCompare 的有機組合來完成排序。這裏對每個 [[Get]]、[[Put]] 或 [[Delete]] 調用的第一個參數是小於 len 的非負整數,SortCompare 調用的參數是前面調用 [[Get]] 內部方法的結果。調用 [[Put]] 和 [[Delete]] 內部方法時,throw 參數是 true。如果 obj 不是稀疏的,則必須不調用 [[Delete]]。
- 返回 obj。
返回的對象必須擁有下面兩個性質。
- 必須有這樣的數學排列 π,它是由比 len 小的非負整數組成,對於每個比 len 小的非負整數 j,如果屬性 old[j] 存在 , 則 new[π(j)] 有與 old[j] 相同的值,如果屬性 old[j] 不存在,則 new[π(j)] 也不存在。
- 對於都比 len 小的所有非負整數 j 和 k,如果 SortCompare(j, k) < 0, 則 π(j) < π(k).
這裏的符號 old[j] 用來指:假定在執行這個函數之前以 j 作爲參數調用 obj 的 [[Get]] 內部方法的結果,符號 new[j] 用來指:假定在執行這個函數後以 j 作爲參數調用 obj 的 [[Get]] 內部方法的結果。
如果對於集合 S 裏的任何值 a、b、c(可以是相同值),都滿足以下所有條件,那麼函數 comparefn 是在集合 S 上保持一致的比較函數(以下,符號 a <CF b 表示 comparefn(a, b) < 0;符號 a =CF b 表示 comparefn(a, b) = 0(不論正負); 符號 a >CF b 表示 comparefn(a, b) > 0):
- 當用指定值 a 和 b 作爲兩個參數調用 comparefn(a, b),總是返回相同值 v。此外 Type(v) 是 Number, 並且 v 不是 NaN。注意,這意味着對於給定的 a 和 b,a <CF b、a =CF b、a >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 傳遞)
當用兩個參數 j 和 k 調用抽象操作 SortCompare,採用如下步驟:
- 令 jString 爲 ToString(j)。
- 令 kString 爲 ToString(k)。
- 令 hasj 爲 以 jString 作爲參數調用 obj 的 [[HasProperty]] 內部方法的結果。
- 令 hask 爲 以 kString 作爲參數調用 obj 的 [[HasProperty]] 內部方法的結果。
- 如果 hasj 和 hask 都是 false,則返回 +0。
- 如果 hasj 是 false,則返回 1。
- 如果 hask 是 false,則返回 -1。
- 令 x 爲 以 jString 作爲參數調用 obj 的 [[Get]] 內部方法的結果。
- 令 y 爲 以 kString 作爲參數調用 obj 的 [[Get]] 內部方法的結果。
- 如果 x 和 y 都是 undefined,返回 +0。
- 如果 x 是 undefined,返回 1。
- 如果 y 是 undefined,返回 −1。
- 如果 參數 comparefn 不是 undefined, 則
- 如果 IsCallable(comparefn) 是 false,拋出一個 TypeError 異常。
- 傳入 undefined 作爲 this 值,以 x 和 y 作爲參數調用 comparefn 的 [[Call]] 內部方法,返回結果。
- 令 xString 爲 ToString(x)。
- 令 yString 爲 ToString(y)。
- 如果 xString < yString,返回 −1。
- 如果 xString > yString,返回 1。
- 返回 +0。
Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
當以兩個或更多參數 start、deleteCount 和(可選的)item1、item2, 等,調用 splice 方法,從數組索引 start 開始的 deleteCount 個數組元素會被替換爲參數 item1、item2, 等。返回一個包含參數元素(如果有)的數組。採用以下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 A 爲 彷彿用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
- 令 lenVal 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 令 relativeStart 爲 ToInteger(start)。
- 如果 relativeStart 爲負,令 actualStart 爲 max((len + relativeStart),0); 否則令 actualStart 爲 min(relativeStart, len)。
- 令 actualDeleteCount 爲 min(max(ToInteger(deleteCount),0),len - actualStart)。
- 令 k 爲 0。
- 只要 k < actualDeleteCount 就重複
- 令 from 爲 ToString(actualStart + k)。
- 令 fromPresent 爲 以 from 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 fromPresent 是 true,則
- 令 fromValue 爲 以 from 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 以 ToString(k), 屬性描述符 {[[Value]]: fromValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- k 遞增 1.
- 令 items 爲一個內部列表,它的元素是實際參數列表中 item1 開始的參數(從左到右的順序)。如果沒傳入這些項目,則列表是空的。
- 令 itemCount 爲 items 的元素個數。
- 如果 itemCount < actualDeleteCount,則
- 令 k 爲 actualStart。
- 只要 k < (len - actualDeleteCount) 就重複
- 令 from 爲 ToString(k + actualDeleteCount)。
- 令 to 爲 ToString(k + itemCount)。
- 令 fromPresent 爲 以 from 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 fromPresent 是 true,則
- 否則,fromPresent 是 false
- 以 to 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- k 遞增 1。
- 令 k 爲 len。
- 只要 k > (len - actualDeleteCount + itemCount) 就重複
- 以 ToString(k - 1) 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- k 遞減 1.
- 否則如果 itemCount > actualDeleteCount,則
- 令 k 爲 (len - actualDeleteCount)。
- 只要 k > actualStart 就重複
- 令 from 爲 ToString(k + actualDeleteCount - 1)。
- 令 to 爲 ToString(k + itemCount - 1)
- 令 fromPresent 爲 以 from 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 fromPresent 是 true, 則
- 否則,fromPresent 是 false
- 以 to 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- k 遞減 1。
- 令 k 爲 actualStart。
- 只要 items 不是空 就重複
- 以 "length"、(len - actualDeleteCount + itemCount) 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 A。
splice 方法的 length 屬性是 2。
Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
將參數們插入到數組的開始位置,它們在數組中的順序與它們出現在參數列表中的順序相同。
當以零或更多個參數 item1、item2,等,調用 unshift 方法,採用如下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenVal 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenVal)。
- 令 argCount 爲 實際參數的個數。
- 令 k 爲 len。
- 只要 k > 0,就重複
- 令 from 爲 ToString(k - 1)。
- 令 to 爲 ToString(k + argCount - 1)。
- 令 fromPresent 爲 以 from 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 fromPresent 是 true,則
- 否則,fromPresent 是 false
- 以 to 和 true 作爲參數調用 O 的 [[Delete]] 內部方法。
- k 遞減 1。
- 令 j 爲 0。
- 令 items 爲一個內部列表,它的元素是調用這個函數時傳入的實際參數(從左到右的順序)。
- 只要 items 不是空,就重複
- 以 "length"、len + argCount 和 true 作爲參數調用 O 的 [[Put]] 內部方法。
- 返回 len + argCount。
unshift 方法的 length 屬性是 1。
Array.prototype.indexOf ( searchElement [ , fromIndex ] )
indexOf 按照索引的升序比較 searchElement 和數組裏的元素們,它使用內部的嚴格相等比較算法(11.9.6),如果找到一個或更多這樣的位置,返回這些位置中第一個索引;否則返回 -1。
可選的第二個參數 fromIndex 默認是 0(即搜索整個數組)。如果它大於或等於數組長度,返回 -1,即不會搜索數組。如果它是負的,就把它當作從數組末尾到計算後的 fromIndex 的偏移量。如果計算後的索引小於 0,就搜索整個數組。
當用一個或兩個參數調用 indexOf 方法,採用以下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 len 是 0,返回 -1。
- 如果 傳入了參數 fromIndex,則令 n 爲 ToInteger(fromIndex);否則令 n 爲 0。
- 如果 n ≥ len,返回 -1。
- 如果 n ≥ 0,則
- 令 k 爲 n。
- 否則,n < 0
- 令 k 爲 len - abs(n)。
- 如果 k 小於 0,則令 k 爲 0。
- 只要 k < len,就重複
- 令 kPresent 爲 以 ToString(k) 爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞增 1。
- 返回 -1。
indexOf 方法的 length 屬性是 1。
Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
lastIndexOf 按照索引的降序比較 searchElement 和數組裏的元素們,它使用內部的嚴格相等比較算法 (11.9.6),如果找到一個或更多這樣的位置,返回這些位置中最後一個索引;否則返回 -1。
可選的第二個參數 fromIndex 默認是數組的長度減一(即搜索整個數組)。如果它大於或等於數組長度,將會搜索整個數組。如果它是負的,就把它當作從數組末尾到計算後的 fromIndex 的偏移量。如果計算後的索引小於 0,返回 -1。
當用一個或兩個參數調用 lastIndexOf 方法,採用如下步驟 :
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 len 是 0,返回 -1。
- 如果 傳入了參數 fromIndex,則令 n 爲 ToInteger(fromIndex); 否則令 n 爲 len。
- 如果 n ≥ 0,則令 k 爲 min(n, len - 1)。
- 否則,n < 0
- 令 k 爲 len - abs(n)。
- 只要 k ≥ 0 就重複
- 令 kPresent 爲 以 ToString(k) 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞減 1。
- 返回 -1。
lastIndexOf 方法的 length 屬性是 1。
Array.prototype.every ( callbackfn [ , thisArg ] )
callbackfn 應該是個函數,它接受三個參數並返回一個可轉換爲布爾值 true 和 false 的值。every 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,直到他找到一個使 callbackfn 返回 false 的元素。如果找到這樣的元素,every 馬上返回 false,否則如果對所有元素 callbackfn 都返回 true,every 將返回 true。callbackfn 只被數組裏實際存在的元素調用;它不會被缺少的元素調用。
如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。
調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。
對 every 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
every 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 every 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,every 訪問這些元素時的值會傳給 callbackfn;在 every 調用開始後刪除的和之前被訪問過的元素們是不訪問的。every 的行爲就像數學量詞“所有(for all)”。特別的,對一個空數組,它返回 true。
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
- 如果提供了 thisArg,令 T 爲 thisArg;否則令 T 爲 undefined。
- 令 k 爲 0。
- 只要 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞增 1。
- 返回 true。
every 方法的 length 屬性是 1。
Array.prototype.some ( callbackfn [ , thisArg ] )
callbackfn 應該是個函數,它接受三個參數並返回一個可轉換爲布爾值 true 和 false 的值。some 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,直到他找到一個使 callbackfn 返回 true 的元素。如果找到這樣的元素,some 馬上返回 true,否則,some 返回 false。callbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。
如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。
調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。
對 some 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
some 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 some 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,some 訪問這些元素時的值會傳給 callbackfn;在 some 調用開始後刪除的和之前被訪問過的元素們是不訪問的。some 的行爲就像數學量詞“存在(exists)”。特別的,對一個空數組,它返回 false。
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false, 拋出一個 TypeError 異常。
- 如果提供了 thisArg,令 T 爲 thisArg;否則令 T 爲 undefined。
- 令 k 爲 0。
- 只要 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞增 1。
- 返回 false。
some 方法的 length 屬性是 1。
Array.prototype.forEach ( callbackfn [ , thisArg ] )
callbackfn 應該是個函數,它接受三個參數。forEach 按照索引的升序,對數組裏存在的每個元素調用一次
callbackfn。callbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。
如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。
調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。
對 forEach 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
forEach 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 forEach 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,forEach 訪問這些元素時的值會傳給 callbackfn;在 forEach 調用開始後刪除的和之前被訪問過的元素們是不訪問的。
當以一個或兩個參數調用 forEach 方法,採用以下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
- 如果提供了 thisArg,令 T 爲 thisArg;否則令 T 爲 undefined。
- 令 k 爲 0。
- 只要 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞增 1。
- 返回 undefined。
forEach 方法的 length 屬性是 1。
Array.prototype.map ( callbackfn [ , thisArg ] )
callbackfn 應該是個函數,它接受三個參數。map 按照索引的升序,對數組裏存在的每個元素調用一次 callbackfn,並用結果構造一個新數組。callbackfn 只被實際存在的數組元素調用;它不會被缺少的數組元素調用。
如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。
調用 callbackfn 時將傳入三個參數:元素的值,元素的索引,和遍歷的對象。
對 map 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
map 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 map 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,map 訪問這些元素時的值會傳給 callbackfn;在 map 調用開始後刪除的和之前被訪問過的元素們是不訪問的。
當以一個或兩個參數調用 map 方法,採用以下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
- 如果提供了 thisArg,令 T 爲 thisArg;否則令 T 爲 undefined。
- 令 A 爲 彷彿用 new Array(len) 創建的新數組,這裏的 Array 是標準內置構造器名,len 是 len 的值。
- 令 k 爲 0。
- 只要 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- 令 kValue 爲 以 Pk 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 mappedValue 爲 以 T 作爲 this 值以包含 kValue、k 和 O 的參數列表調用 callbackfn 的 [[Call]] 內部方法的結果。
- 以 Pk,屬性描述符 {[[Value]]: mappedValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- k 遞增 1。
- 返回 A。
map 方法的 length 屬性是 1。
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 調用開始後刪除的和之前被訪問過的元素們是不訪問的。
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false, 拋出一個 TypeError 異常。
- 如果提供了 thisArg,令 T 爲 thisArg;否則令 T 爲 undefined。
- 令 A 爲 彷彿用 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
- 令 k 爲 0。
- 令 to 爲 0。
- 只要 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- 令 kValue 爲 以 Pk 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 selected 爲 以 T 作爲 this 值以包含 kValue、k 和 O 的參數列表調用 callbackfn 的 [[Call]] 內部方法的結果。
- 如果
ToBoolean(selected) 是 true,則
- 以 ToString(to),屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- to 遞增 1。
- k 遞增 1。
- 返回 A。
filter 方法的 length 屬性是 1。
Array.prototype.reduce ( callbackfn [ , initialValue ] )
callbackfn 應該是個函數,它需要四個參數。reduce 按照索引的升序,對數組裏存在的每個元素,將 callbackfn 作爲回調函數調用一次。
調用 callbackfn 時將傳入四個參數:previousValue(initialValue 的值或上次調用 callbackfn 的返回值)、currentValue(當前元素值)、currentIndex 和遍歷的對象。第一次調用回調函數時,previousValue 和 currentValue 的取值可以是下面兩種情況之一。如果爲 reduce 調用提供了一個 initialValue,則 previousValue 將等於 initialValue 並且 currentValue 將等於數組的首個元素值。如果沒提供 initialValue,則 previousValue 將等於數組的首個元素值並且 currentValue 將等於數組的第二個元素值。如果數組裏沒有元素並且沒有提供 initialValue,則拋出一個 TypeError 異常。
對 reduce 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
reduce 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 reduce 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,reduce 訪問這些元素時的值會傳給 callbackfn;在 reduce 調用開始後刪除的和之前被訪問過的元素們是不訪問的。
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
- 如果 len 是 0 並且 initialValue 不是 present,拋出一個 TypeError 異常。
- 令 k 爲 0。
- 如果 initialValue 參數有傳入值,則
- 設定 accumulator 爲 initialValue。
- 否則,initialValue 參數沒有傳入值
- 令 kPresent 爲 false。
- 只要 kPresent 是 false 並且 k < len,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- 令 accumulator 爲 以 Pk 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- k 遞增 1.
- 如果 kPresent 是 false,拋出一個 TypeError 異常。
- 只要 k < len,重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞增 1。
- 返回 accumulator。
reduce 方法的 length 屬性是 1。
Array.prototype.reduceRight ( callbackfn [ , initialValue ] )
callbackfn 應該是個函數,它需要四個參數。reduceRight 按照索引的升序,對數組裏存在的每個元素 , 將 callbackfn 作爲回調函數調用一次。
調用 callbackfn 時將傳入四個參數:previousValue(initialValue 的值或上次調用 callbackfn 的返回值),currentValue(當前元素值),currentIndex 和遍歷的對象。第一次調用回調函數時,previousValue 和 currentValue 的取值可以是下面兩種情況之一。如果爲 reduceRight 調用提供了一個 initialValue,則 previousValue 將等於 initialValue 並且 currentValue 將等於數組的最後一個元素值。如果沒提供 initialValue,則 previousValue 將等於數組的最後一個元素值並且 currentValue 將等於數組的倒數第二個元素值。如果數組裏沒有元素並且沒有提供 initialValue,則拋出一個 TypeError 異常。
對 reduceRight 的調用不直接更改對象,但是對 callbackfn 的調用可能更改對象。
reduceRight 處理的元素範圍是在首次調用 callbackfn 之前設定的。在 reduceRight 調用開始後追加到數組裏的元素們不會被 callbackfn 訪問。如果更改以存在數組元素,reduceRight 訪問這些元素時的值會傳給 callbackfn;在 reduceRight 調用開始後刪除的和之前被訪問過的元素們是不訪問的。
當以一個或兩個參數調用 reduceRight 方法,採用以下步驟:
- 令 O 爲 以 this 值作爲參數調用 ToObject 的結果。
- 令 lenValue 爲 以 "length" 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- 令 len 爲 ToUint32(lenValue)。
- 如果 IsCallable(callbackfn) 是 false,拋出一個 TypeError 異常。
- 如果 len 是 0 並且 initialValue 不是 present,拋出一個 TypeError 異常。
- 令 k 爲 0。
- 如果 initialValue 參數有傳入值,則
- 設定 accumulator 爲 initialValue。
- 否則,initialValue 參數沒有傳入值
- 令 kPresent 爲 false。
- 只要 kPresent 是 false 並且 k ≥ 0,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- 令 accumulator 爲 以 Pk 作爲參數調用 O 的 [[Get]] 內部方法的結果。
- k 遞減 1。
- 如果 kPresent 是 false,拋出一個 TypeError 異常。
- 只要 k ≥ 0,就重複
- 令 Pk 爲 ToString(k)。
- 令 kPresent 爲 以 Pk 作爲參數調用 O 的 [[HasProperty]] 內部方法的結果。
- 如果 kPresent 是 true,則
- k 遞減 1.
- 返回 accumulator。
reduceRight 方法的 length 屬性是 1。
Array 實例的屬性
Array 實例從數組原型對象繼承屬性,Array 實例的 [[Class]] 內部屬性是 "Array"。Array 實例還有以下屬性。
[[DefineOwnProperty]] ( P, Desc, Throw )
數組對象使用一個,用在其他原生 ECMAscript 對象的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的變化版。
設 A 爲一個數組對象,Desc 爲一個屬性描述符,Throw 爲一個布爾標示。
在以下算法中,術語“拒絕”指代“如果 Throw 是 true,則拋出 TypeError 異常,否則返回 false。
當用屬性名 P、屬性描述 Desc、布爾值 Throw 調用 A 的 [[DefineOwnProperty]] 內部方法,採用以下步驟:
- 令 oldLenDesc 爲 以 "length" 作爲參數調用 A 的 [[GetOwnProperty]] 內部方法的結果。 結果絕不會是 undefined 或一個訪問器描述符,因爲在創建數組時的 length 是一個不可刪除或重新配置的數據屬性。
- 令 oldLen 爲 oldLenDesc.[[Value]]。
- 如果 P 是 "length", 則
- 如果 Desc 的
[[Value]] 字段不存在 , 則
- 以 "length"、Desc、和 Throw 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。
- 令 newLenDesc 爲 Desc 的一個拷貝。
- 令 newLen 爲 ToUint32(Desc.[[Value]])。
- 如果 newLen 不等於 ToNumber(Desc.[[Value]]),拋出一個 RangeError 異常。
- 設定 newLenDesc.[[Value]] 爲 newLen。
- 如果 newLen ≥ oldLen,則
- 以 "length"、newLenDesc 和 Throw 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。
- 如果 oldLenDesc.[[Writable]] 是 false,拒絕
- 如果 newLenDesc.[[Writable]] 不存在或值是 true,令 newWritable 爲 true。
- 否則,
- 因爲它將使得無法刪除任何元素,所以需要延後設定 [[Writable]] 特性爲 false。
- 令 newWritable 爲 false。
- 設定 newLenDesc.[[Writable]] 爲 true。
- 令 succeeded 爲 以 "length"、newLenDesc 和 Throw 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的結果
- 如果 succeeded 是 false,返回 false。
- 只要 newLen < oldLen,就重複,
- 設定 oldLen 爲 oldLen – 1。
- 令 deleteSucceeded 爲 以 ToString(oldLen) 和 false 作爲參數調用 A 的 [[Delete]] 內部方法的結果。
- 如果 deleteSucceeded 是 false,則
- 設定 newLenDesc.[[Value]] 爲 oldLen + 1。
- 如果 newWritable 是 false,設定 newLenDesc.[[Writable]] 爲 false。
- 以 "length"、newLenDesc 和 false 爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法。
- 拒絕。
- 如果 newWritable 是 false,則
- 以 "length",屬性描述符 {[[Writable]]: false} 和 false 作爲參數在 A 上調用 [[DefineOwnProperty]] 內部方法。這個調用始終返回 true。
- 返回 true。
- 如果 Desc 的
[[Value]] 字段不存在 , 則
- 否則如果 P 是一個數組索引 (15.4),則
- 令 index 爲 ToUint32(P)。
- 如果 index ≥ oldLen 並且 oldLenDesc.[[Writable]] 是 false,拒絕。
- 令 succeeded 爲 以 P、Desc 和 false 作爲參數在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9) 的結果。
- 如果 succeeded 是 false,拒絕。
- 如果 index ≥ oldLen
- 設定 oldLenDesc.[[Value]] 爲 index + 1。
- 以 "length"、oldLenDesc 和 false 作爲參數在在 A 上調用默認的 [[DefineOwnProperty]] 內部方法。這個調用始終返回 true。
- 返回 true。
- 以 P、Desc 和 Throw 作爲參數在在 A 上調用默認的 [[DefineOwnProperty]] 內部方法 (8.12.9),返回結果。
length
數組對象的 length 屬性是個數據屬性,其值總是在數值上大於任何屬性名是數組索引的可刪除屬性的屬性名。
length 屬性擁有的初始特性是 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。
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 原型對象。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
String.fromCharCode ( [ char0 [ , char1 [ , … ] ] ] )
返回一個字符串值,包含的字符數與參數數目相同。每個參數指定返回字符串中的一個字符,也就是說第一個參數第一個字符,以此類推(從左到右)。一個參數轉換爲一個字符,通過先應用 ToUint16 操作,再將返回的16位整數看作字符的代碼單元值。如果沒提供參數,返回空字符串。
fromCharCode 函數的 length 屬性是 1。
字符串原型對象的屬性
字符串原型對象本身是一個值爲空字符串的 String 對象(它的 [[Class]] 是 "String")。
字符串原型對象的 [[Prototype]] 內部屬性值是標準的內置 Object 原型對象。
String.prototype.constructor
String.prototype.constructor 的初始值是內置 String 構造器。
String.prototype.toString ( )
返回 this 字符串值。(注,對於一個 String 對象,toString 方法和 valueOf 方法返回相同值。)
toString 函數是非通用的;如果它的 this 值不是一個字符串或字符串對象,則拋出一個 TypeError 異常。因此它不能作爲方法轉移到其他類型對象上。
String.prototype.valueOf ( )
返回 this 字符串值。
valueOf 函數是非通用的;如果它的 this 值不是一個字符串或字符串對象,則拋出一個 TypeError 異常。因此它不能作爲方法轉移到其他類型對象上。
String.prototype.charAt (pos)
將 this 對象轉換爲一個字符串,返回包含了這個字符串 pos 位置的字符的字符串。如果那個位置沒有字符,返回空字符串。返回結果是個字符串值,不是字符串對象。
如果 pos 是一個數字類型的整數值,則 x.charAt(pos) 與 x.substring(pos, pos + 1) 的結果相等。
當用一個參數 pos 調用 charAt 方法,採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 position 爲 ToInteger(pos)。
- 令 size 爲 S 的字符數。
- 如果 position < 0 或 position ≥ size,返回空字符串。
- 返回一個長度爲 1 的字符串,它包含 S 中 position 位置的一個字符,在這裏 S 中的第一個(最左邊)字符被當作是在位置 0,下一個字符被當作是在位置 1,等等。
String.prototype.charCodeAt (pos)
將 this 對象轉換爲一個字符串,返回一個代表這個字符串 pos 位置字符的代碼單元值的數字(小於 216 的非負整數)。如果那個位置沒有字符,返回 NaN。
當用一個參數 pos 調用 charCodeAt 方法,採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 position 爲 ToInteger(pos)。
- 令 size 爲 S 的字符數。
- 如果 position < 0 或 position ≥ size,返回 NaN.
- 返回一個數字類型值,值是字符串 S 中 position 位置字符的代碼單元值。 在這裏 S 中的第一個(最左邊)字符被當作是在位置 0,下一個字符被當作是在位置 1,等等。
String.prototype.concat ( [ string1 [ , string2 [ , … ] ] ] )
當用一個或更多參數 string1、string2,等,調用 concat 方法,它返回一個字符串,其中包含了轉換成字符串類型的 this 對象中的所有字符和後面跟着的每個參數(例如:string1、string2,等)轉換成字符串類型后里面的所有字符。返回結果是一個字符串值,不是一個字符串對象。採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 args 爲一個內部列表,它是傳給這個函數的參數列表的拷貝。
- 令 R 爲 S。
- 只要 args 不是空,就重複
- 刪除 args 的第一個元素,並令 next 爲這個元素。
- 令 R 爲一個包含了 R 中原有的所有字符跟上 ToString(next) 中的所有字符 的字符串值。
- 返回 R。
concat 方法的 length 屬性是 1.
String.prototype.indexOf (searchString, position)
將 this 對象轉換爲一個字符串,如果 searchString 在這個字符串裏大於或等於 position 的位置中的一個或多個位置使它呈現爲字符串的子串,那麼返回這些位置中最小的索引;否則返回 -1。如果 position 是 undefined,就認爲它是 0,以搜索整個字符串。
indexOf 需要兩個參數 searchString 和 position,執行以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 searchStr 爲 ToString(searchString)。
- 令 pos 爲 ToInteger(position)。(如果 position 是 undefined,此步驟產生 0)。
- 令 len 爲 S 的字符數。
- 令 start 爲 min(max(pos, 0), len)。
- 令 searchLen 爲 SearchStr 的字符數。
- 返回 一個不小於 start 的可能的最小值整數 k,使得 k + searchLen 不大於 len,並且對所有小於 searchLen 的非負數整數 j、S 的 k + j 位置字符和 searchStr 的 j 位置字符相同;但如果沒有這樣的整數 k,則返回 -1。
indexOf 的 length 屬性是 1。
String.prototype.lastIndexOf (searchString, position)
將 this 對象轉換爲一個字符串,如果 searchString 在這個字符串裏小於或等於 position 的位置中的一個或多個位置使它呈現爲字符串的子串,那麼返回這些位置中最大的索引;否則返回
-1。如果 position 是 undefined
,就認爲它是字符串值的長度,以搜索整個字符串。
lastIndexOf 需要兩個參數 searchString 和 position,執行以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 searchStr 爲 ToString(searchString)。
- 令 numPos 爲 ToNumber(position)。( 如果 position 是 undefined,此步驟產生 NaN)。
- 如果 numPos 是 NaN,令 pos 爲 +∞;否則,令 pos 爲 ToInteger(numPos)。
- 令 len 爲 S 的字符數。
- 令 start 爲 min(max(pos, 0), len)。
- 令 searchLen 爲 SearchStr 的字符數。
- 返回 一個不大於 start 的可能的最大值整數 k,使得 k + searchLen 不大於 len,並且對所有小於 searchLen 的非負數整數 j,S 的 k + j 位置字符和 searchStr 的 j 位置字符相同;但如果沒有這樣的整數 k,則返回 -1。。
lastIndexOf 的 length 屬性是 1。
String.prototype.localeCompare (that)
當以一個參數 that 來調用 localeCompare 方法,它返回一個非 NaN 數字值,這個數字值反應了對 this 值(轉換爲字符串)和 that 值(轉換爲字符串)進行語言環境敏感的字符串比較的結果。兩個字符串 S 和 That 用實現定義的一種方式進行比較。比較結果是按照系統默認語言環境指定的順序來排列字符串。根據這三種情況:S 在 That 前面、兩字符串相同、S 在 That 後面,分別返回:負數、零、正數。
在執行比較之前執行以下步驟以預備好字符串:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 That 爲 ToString(that)。
如果將 localeCompare 方法看做是將 this 和 that 作爲兩個參數的函數,那麼它是在所有字符串集合上的保持一致的比較函數(在 15.4.4.11 定義)。
實際返回值是實現定義的,允許實現者們在返回值裏編碼附加信息。但是函數需要定義一個在所有字符串上的總的順序。並且,當比較的字符串們被認爲是 Unicode 標準定義的標準等價,則返回 0。
如果宿主環境沒有在所有字符串上語言敏感的比較,此函數可執行按位比較。
String.prototype.match (regexp)
當以 regexp 作爲參數調用 match 方法,採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 如果 Type(regexp) 是 Object 並且 regexp 的 [[Class]] 內部屬性的值是 "RegExp",則令 rx 爲 regexp;
- 否則,令 rx 爲 彷彿是用表達式 new RegExp(regexp) 創建的新正則對象,這裏的 RegExp 是標準內置構造器名。
- 令 global 爲 以 "global" 爲參數調用 rx 的 [[Get]] 內部方法的結果。
- 令 exec 爲 標準內置函數 RegExp.prototype.exec ( 見 15.10.6.2)
- 如果 global 不是 true,則
- 以 rx 作爲 this 值,用包含 S 的參數列表調用 exec 的 [[Call]] 內部方法,返回結果。
- 否則,global 是 true
- 以 "lastIndex" 和 0 作爲參數調用 rx 的 [[Put]] 內部方法。
- 令 A 爲 彷彿是用表達式 new Array() 創建的新數組,這裏的 Array 是標準內置構造器名。
- 令 previousLastIndex 爲 0。
- 令 n 爲 0。
- 令 lastMatch 爲 true。
- 只要 lastMatch 是 true,就重複
- 令 result 爲 以 rx 作爲 this 值,用包含 S 的參數列表調用 exec 的 [[Call]] 內部方法的結果。
- 如果 result 是 null,則設定 lastMatch 爲 false。
- 否則,result 不是 null
- 令 thisIndex 爲 以 "lastIndex" 爲參數調用 rx 的 [[Get]] 內部方法的結果。
- 如果 thisIndex = previousLastIndex 則
- 以 "lastIndex" 和 thisIndex + 1 爲參數調用 rx 的 [[Put]] 內部方法。
- 設定 previousLastIndex 爲 thisIndex + 1。
- 否則,設定 previousLastIndex 爲 thisIndex。
- 令 matchStr 爲 以 0 爲參數調用 result 的 [[Get]] 內部方法的結果。
- 以 ToString(n),屬性描述符 {[[Value]]: matchStr, [[Writable]]: true, [[Enumerable]]: true, [[configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- n 遞增 1。
- 如果 n = 0,則返回 null。
- 返回 A。
String.prototype.replace (searchValue, replaceValue)
首先根據以下步驟設定 string:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 string 爲 以 this 值作爲爲參數調用 ToString 的結果。
如果 searchValue 是一個正則表達式([[Class]] 內部屬性是 "RegExp" 的對象),按照如下執行:如果 searchValue.global 是 false,則搜索 string,找出匹配正則表達式 searchValue 的第一個子字符串。如果 searchValue.global 是 true,則搜索 string,找出匹配正則表達式 searchValue 的所有子字符串。搜索的做法與 String.prototype.match 相同,包括對 searchValue.lastIndex 的更新。令 m 爲 searchValue 的左捕獲括號的個數(使用 15.10.2.1 指定的 NcapturingParens)。
如果 searchValue 不是正則表達式,令 searchString 爲 ToString(searchValue),並搜索 string,找出第一個出現的 searchString 的子字符串。令 m 爲 0。
如果 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 裏的一個 $ ,如果不符合以下任何格式,就保持原狀。
字符 | 替代文本 |
---|---|
$$ | $ |
$& | 匹配到的子字符串 |
$` | string 中匹配到的子字符串之前部分。 |
$' | string 中匹配到的子字符串之後部分。 |
$n | 第 n 個捕獲結果,n 是範圍在 1 到 9 的單個數字,並且緊接着 $n 後面的不是十進制數字。如果 n ≤ m 且第 n 個捕獲結果是 undefined,就用空字符串代替。如果 n > m,結果是實現定義的。 |
$nn | 第 nn 個捕獲結果,nn 是範圍在 01 到 99 的十進制兩位數。如果 nn ≤ m 且第 nn 個捕獲結果是 undefined,就用空字符串代替。如果 nn > m,結果是實現定義的。 |
String.prototype.search (regexp)
當用參數 regexp 調用 search 方法,採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 string 爲 以 this 值作爲參數調用 ToString 的結果。
- 如果 Type(regexp) 是 Object 且 regexp 的 [[Class]] 內部屬性的值是 "RegExp", 則令 rx 爲 regexp;
- 否則,令 rx 爲彷彿是用表達式 new RegExp(regexp) 創建的新正則對象,這裏的 RegExp 是標準內置構造器名。
- 從 string 開始位置搜索正則表達式模式 rx 的匹配。如果找到匹配,令 result 爲匹配在 string 裏的偏移量;如果沒有找到匹配,令 result 爲 -1。執行搜索時 regexp 的 lastIndex 和 global 屬性是被忽略的。regexp 的 lastIndex 屬性保持不變。
- 返回 result。
String.prototype.slice (start, end)
slice 方法需要兩個參數 start 和 end,將 this 對象轉換爲一個字符串,返回這個字符串中從 start 位置的字符到(但不包含)end 位置的字符的一個子字符串(或如果 end 是 undefined,就直接到字符串尾部)。用 sourceLength 表示字符串長度,如果 start 是負數,就把它看做是 sourceLength + start;如果 end 是負數,就把它看做是 sourceLength + end。返回結果是一個字符串值,不是字符串對象。採用以下步驟:
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 len 爲 S 的字符數 .
- 令 intStart 爲 ToInteger(start)。
- 如果 end 是 undefined,令 intEnd 爲 len;否則 令 intEnd 爲 ToInteger(end)。
- 如果 intStart 是 negative,令 from 爲 max(len + intStart , 0);否則 令 from 爲 min(intStart , len)。
- 如果 intEnd 是 negative,令 to 爲 max(len + intEnd, 0);否則 令 to 爲 min(intEnd,len)。
- 令 span 爲 max(to - from, 0 )。
- 返回 一個包含 S 中 form 位置的字符開始的 span 個連續字符 的字符串。
slice 方法的 length 屬性是 2。
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", ""]
如果 separator 是 undefined,則返回結果是隻包含 this 值(轉換爲字符串)一個字符串元素的數組。如果 limit 不是 undefined,則輸出數組被切斷爲包含不大於 limit 個元素。
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 A 爲 彷彿使用表達式 new Array() 創建的新對象,這裏的 Array 是標準內置構造器名。
- 令 lengthA 爲 0。
- 如果 limit 是 undefined,令 lim = 232 - 1; 否則 令 lim = ToUint32(limit)。
- 令 s 爲 S 的字符數。
- 令 p = 0。
- 如果 separator 是正則對象(它的 [[Class]] 是 "RegExp"),令 R = separator;否則,令 R = ToString(separator)。
- 如果 lim = 0,返回 A。
- 如果 separator 是 undefined, 則
- 以 "0"、屬性描述符 {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- 返回 A。
- 如果 s = 0,則
- 調用 SplitMatch(S, 0, R) 並 令 z 爲 它的 MatchResult 結果。
- 如果 z 不是 failure,返回 A。
- 以 "0"、屬性描述符 {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- 返回 A。
- 令 q = p。
- 只要 q ≠ s,就重複
- 調用 SplitMatch(S, q, R) 並 令 z 爲 它的 MatchResult 結果。
- 如果 z 是 failure, 則 令 q = q + 1。
- 否則,z 不是 failure
- z 必定是一個 State。令 e 爲 z 的 endIndex 並 令 cap 爲 z 的 captures 數組。
- 如果 e = p,則 令 q = q + 1。
- 否則,e ≠ p
- 令 T 爲一個字符串,它的值等於包含 在 S 中 p(包括它)位置到 q(不包括)位置的字符 的子字符串的值。
- 以 ToString(lengthA)、屬性描述符 {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法 .
- lengthA 遞增 1。
- 如果 lengthA = lim,返回 A。
- 令 p = e。
- 令 i = 0。
- 只要 i 不等於 cap 中的元素個數,就重複。
- 令 i = i + 1。
- 以 ToString(lengthA)、屬性描述符 {[[Value]]: cap[i], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- lengthA 遞增 1。
- 如果 lengthA = lim,返回 A。
- 令 q = p。
- 令 T 爲 爲一個字符串,它的值等於包含 在 S 中 p(包括它)位置到 q(不包括)位置的字符 的子字符串的值。
- 以 ToString(lengthA)、屬性描述符 {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 作爲參數調用 A 的 [[DefineOwnProperty]] 內部方法。
- 返回 A。
SplitMatch 抽象操作需要三個參數,字符串 S、整數
q、字符串或正則對象 R,按照以下順序執行並返回一個
MatchResult:
- 如果 R 是個正則對象 ( 它的
[[Class]] 是 "RegExp"),則
- 以 S 和 q 作爲參數調用 R 的 [[Match]] 內部方法,並返回 MatchResult 的結果。
- 否則,Type(R) 必定是 String。令 r 爲 R 的字符數。
- 令 s 爲 S 的字符數 .
- 如果 q + r > s 則返回 MatchResult failure。
- 如果存在一個在 0(包括)到 r(不包括)之間的整數 i,使得 S 的 q + i 位置上的字符和 R 的 i 位置上的字符不同,則返回 failure。
- 令 cap 爲 captures 的空數組 ( 見 15.10.2.1)。
- 返回 State 數據結構 (q + r, cap). ( 見 15.10.2.1)
split 方法的 length 屬性是 2.
String.prototype.substring (start, end)
substring 方法需要兩個參數 start 和 end,將 this 對象轉換爲一個字符串,返回一個子串,這個子串包含了在轉換結果字符串中從 start 位置字符一直到(但不包括)end 位置的字符(或如果 end 是 undefined,就到字符串末尾)。返回結果是字符串值,不是字符串對象。
如果任一參數是 NaN 或負數,它被零取代;如果任一參數大於字符串長度,它被字符串長度取代。
如果 start 大於 end,交換它們的值。
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 len 爲 S 的字符數。
- 令 intStart 爲 ToInteger(start)。
- 如果 end 是 undefined,令 intEnd 爲 len;否則 令 intEnd 爲 ToInteger(end)。
- 令 finalStart 爲 min(max(intStart, 0 ), len)。
- 令 finalEnd 爲 min(max(intEnd, 0 ), len)。
- 令 from 爲 min(finalStart, finalEnd)。
- 令 to 爲 max(finalStart, finalEnd)。
- 返回 一個長度是 to - from 的字符串,它包含 S 中從索引值 form 到 to - 1(按照索引升序)的所有字符。
substring 方法的 length 屬性是 2。
String.prototype.toLowerCase ( )
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 L 爲一個字符串,L 的每個字符是 S 中相應字符的 Unicode 小寫等量,或者(如果沒有 Unicode 小寫等量存在)是實際的 S 中相應字符值。
- 返回 L。
爲了此操作,字符串的16位代碼單元被看作是 Unicode 基本多文種平面中的代碼點。代理代碼點直接從 S 轉移到 L,不做任何映射。
返回結果必須是根據 Unicode 字符數據庫裏的大小寫映射得到的(對此數據庫明確規定,不僅包括 UnicodeData.txt 文件,而且還包括 Unicode 2.1.8 和更高版本里附帶的 SpecialCasings.txt 文件)。
String.prototype.toLocaleLowerCase ( )
此函數產生依照 宿主環境的當前語言設置 更正的結果,而不是獨立於語言環境的結果,除此之外它的運作方式與 toLowerCase 完全一樣。只有在少數情況下有一個區別(如,土耳其語),就是那個語言和正規 Unicode 大小寫映射有衝突時的規則。
String.prototype.toUpperCase ( )
此函數的將字符映射到在 Unicode 字符數據庫中與其等值的大寫字符,除此之外此函數的行爲採用與 String.prototype.toLowerCase 完全相同的方式。
String.prototype.toLocaleUpperCase ( )
此函數產生依照 宿主環境的當前語言設置 更正的結果,而不是獨立於語言環境的結果,除此之外它的運作方式與 toUpperCase 完全一樣。只有在少數情況下有一個區別(如,土耳其語),就是那個語言和正規 Unicode 大小寫映射有衝突時的規則。
String.prototype.trim ( )
- 以 this 值作爲參數調用 CheckObjectCoercible。
- 令 S 爲以 this 值作爲參數調用 ToString 的結果。
- 令 T 爲一個字符串值,它是 S 的一個拷貝,並刪除了開頭和結尾中空白的。空白的定義是 空白字符 和 行終止符 的並集。
- 返回 T。
String 實例的屬性
字符串實例從字符串原型對象繼承屬性,字符串實例的 [[Class]] 內部屬性值是 "String"。字符串實例還有 [[PrimitiveValue]] 內部屬性,length 屬性,和一組屬性名是數組索引的可遍歷屬性。
[[PrimitiveValue]] 內部屬性是代表這個字符串對象的字符串值。以數組索引命名的屬性對應字符串值裏的單字符。一個特殊的 [[GetOwnProperty]] 內部方法用來爲數組索引命名的屬性指定數字,值,和特性。
length
在代表這個字符串對象的字符串值裏的字符數。
一旦創建了一個字符串對象,這個屬性是不可變的。它有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
[[GetOwnProperty]] ( P )
數組對象使用一個,用在其他原生 ECMAscript 對象的 [[GetOwnProperty]] 內部方法的變化版。這個特殊內部方法用來給命名屬性添加訪問器,對應到字符串對象的單字符。
設 S 爲一個字符串對象,P 爲一個字符串。
當以屬性名 P 調用 S 的 [[GetOwnProperty]] 內部方法,採用以下步驟:
- 令 desc 爲 以 P 爲參數調用 S 的默認 [[GetOwnProperty]] 內部方法的結果。
- 如果 desc 不是 undefined,返回 desc。
- 如果 ToString(abs( ToInteger(P ))) 與 P 的值不同,返回 undefined。
- 令 str 爲 S 的 [[PrimitiveValue]] 內部屬性字符串值。
- 令 index 爲 ToInteger(P)。
- 令 len 爲 str 裏的字符數。
- 如果 len ≤ index,返回 undefined。
- 令 resultStr 爲一個長度爲 1 的字符串,裏面包含 str 中 index 位置的一個字符,在這裏 str 中的第一個(最左邊)字符被認爲是在位置 0,下一個字符在位置 1,依此類推。
- 返回一個屬性描述符 { [[Value]]: resultStr, [[Enumerable]]: true, [[Writable]]: false, [[Configurable]]: false }
Boolean 對象
作爲函數調用 Boolean 構造器
當把 Boolean 作爲函數來調用,而不是作爲構造器,它執行一個類型轉換。
Boolean (value)
返回由 ToBoolean(value) 計算出的 Boolean 值(非 Boolean 對象)。
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 原型對象。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Boolean 原型對象的屬性
Boolean 原型對象自身是一個值爲 false 的 Boolean 對象(它的 [[Class]] 是 "Boolean")。
Boolean 原型對象的 [[Prototype]] 內部屬性值是標準的內置 Object 原型對象。
Boolean.prototype.constructor
Boolean.prototype.constructor 的初始值是內置的 Boolean 構造器。
Boolean.prototype.toString ( )
採用以下步驟:
- 令 B 爲 this 值。
- 如果 Type(B) 是 Boolean,則令 b 爲 B。
- 否則如果 Type(B) 是 Object 且 B 的 [[Class]] 內部屬性值是 "Boolean",則令 b 爲 B 的 [[PrimitiveValue]] 內部屬性值。
- 否則拋出一個 TypeError 異常。
- 如果 b 是 true,則返回 "true";否則返回 "false"。
Boolean.prototype.valueOf ( )
採用以下步驟:
- 令 B 爲 this 值。
- 如果 Type(B) 是 Boolean,則令 b 爲 B。
- 否則如果 Type(B) 是 Object 且 B 的 [[Class]] 內部屬性值是 "Boolean",則令 b 爲 B 的 [[PrimitiveValue]] 內部屬性值。
- 否則拋出一個 TypeError 異常。
- 返回 b。
Boolean 實例的屬性
Boolean 實例從 Boolean 原型對象繼承屬性,且 Boolean 實例的 [[Class]] 內部屬性值是 "Boolean"。Boolean 實例 還有一個 [[PrimitiveValue]] 內部屬性。
[[PrimitiveValue]] 內部屬性是代表這個 Boolean 對象的 Boolean 值。
Number 對象
作爲函數調用的 Number 構造器
當把 Number 當作一個函數來調用,而不是作爲構造器,它執行一個類型轉換。
Number ( [ value ] )
如果提供了 value,返回 ToNumber(value) 計算出的 Number 值(非 Number 對象),否則返回 +0。
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 原型對象。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Number.MAX_VALUE
Number.MAX_VALUE 的值是 Number 類型的最大正有限值,約爲 1.7976931348623157×10308。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Number.MIN_VALUE
Number.MIN_VALUE 的值是 Number 類型的最小正有限值,約爲 5×10-324。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Number.NaN
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Number.NEGATIVE_INFINITY
Number.NEGATIVE_INFINITY 的值是-∞。
這個屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY 的值是 +∞。
這個屬性有特性 { [[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]] 內部屬性值;或如果 this 是 Number 類型,“this Number 值”指 this。如果 this 值不是 [[Class]] 內部屬性爲 "Number" 的對象,也不是 Number 類型的值,則拋出一個 TypeError 異常。
Number.prototype.constructor
Number.prototype.constructor 的初始值是內置 Number 構造器。
Number.prototype.toString ( [ radix ] )
可選參數 radix 應當是 2 到 36 閉區間上的整數。如果 radix 不存在或是 undefined,用數字 10 作爲 radix 的值。如果 ToInteger(radix) 是數字 10,則將 this Number 對象 作爲一個參數傳給 ToString 抽象操作;返回結果字符串值。
如果 ToInteger( radix ) 不是在 2 到 36 閉區間上的整數,則拋出一個 RangeError 異常。如果 ToInteger( radix ) 是 2 到 36 的整數,但不是 10,則結果是 this Number 值 使用指定基數表示法的字符串。字母 a-z 用來指值爲 10 到 35 的數字。基數不爲 10 時的精確算法是依賴於實現的,然而算法應當是 9.8.1 指定算法的推廣形式。
toString 函數不是通用的;如果 this 值不是數字或 Number 對象,拋出一個 TypeError 異常。因此它不能當作方法轉移到其他類型對象上。
Number.prototype.toLocaleString()
根據宿主環境的當前語言環境慣例來格式化 this Number 值,生成代表這個值的字符串。此函數是依賴於實現的,允許但不鼓勵它的返回值與 toString 相同。
Number.prototype.valueOf ( )
返回 this Number 值。
valueOf 函數不是通用的;如果 this 值不是數字或 Number 對象,拋出一個 TypeError 異常。因此它不能當作方法轉移到其他類型對象上。
Number.prototype.toFixed (fractionDigits)
返回一個包含了 代表 this Number 值的留有小數點後 fractionDigits 個數字的十進制固定小數點記法 的字符串。如果 fractionDigits 是 undefined,就認爲是 0。具體來說,執行以下步驟:
- 令 f 爲 ToInteger(fractionDigits)。(如果 fractionDigits 是 undefined,此步驟產生 0 值。)
- 如果 f < 0 或 f > 20,拋出一個 RangeError 異常。
- 令 x 爲 this Number 值。
- 如果 x 是 NaN,返回字符串 "NaN"。
- 令 s 爲空字符串。
- 如果 x < 0,則
- 令 s 爲 "-"。
- 令 x = -x。
- 如果 x ≥ 1021,則
- 令 m = ToString(x)。
- 否則,x < 1021
- 令 n 爲一個整數,讓 n ÷ 10f - x 準確的數學值儘可能接近零。如果有兩個這樣 n 值,選擇較大的 n。
- 如果 n = 0,令 m 爲字符串 "0"。否則,令 m 爲由 n 的十進制表示裏的數 組成的字符串(爲了沒有前導零)。
- 如果 f ≠ 0,則
- 令 k 爲 m 裏的字符數目。
- 如果 k ≤ f,則
- 令 z 爲 f + 1 - k 個 '0' 組成的字符串。
- 令 m 爲 串聯字符串 z 和 m 的結果。
- 令 k = f + 1。
- 令 a 爲 m 的前 k – f 個字符,令 b 爲其餘 f 個字符。
- 令 m 爲 串聯三個字符串 a、"." 和 b 的結果。
- 返回串聯字符串 s 和 m 的結果。
toFixed 方法的 length 屬性是 1。
如果以多個參數調用 toFixed 方法,則行爲是不確定的(見15章)。
實現是被允許在 fractionDigits 小於 0 或大於 20 時擴展 toFixed 的行爲。在這種情況下,對這樣的 fractionDigits 值 toFixed 將未必拋出 RangeError。
(1000000000000000128).toString() 返回 "1000000000000000100",
而 (1000000000000000128).toFixed(0) 返回 "1000000000000000128"。
Number.prototype.toExponential (fractionDigits)
返回一個代表 this Number 值 的科學計數法的字符串,它的有效數字的小數點前有一個數字,有效數字的小數點後有 fractionDigits 個數字。如果 fractionDigits 是 undefined,包括指定唯一 Number 值需要的儘可能多的有效數字(就像 ToString,但在這裏總是以科學計數法輸出)。具體來說執行以下步驟:
- 令 x 爲 this Number 值。
- 令 f 爲 ToInteger(fractionDigits)。
- 如果 x 是 NaN,返回字符串 "NaN"。
- 令 s 爲空字符串。
- 如果 x < 0,則
- 令 s 爲 "-"。
- 令 x = -x。
- 如果 x = +∞,則
- 返回串聯字符串 s 和 "Infinity" 的結果。
- 如果 fractionDigits 不是 undefined 且(f < 0 或 f > 20),拋出一個 RangeError 異常。
- 如果 x = 0,則
- 令 f = 0。
- 令 m 爲包含 f + 1 個 '0' 的字符串。
- 令 e = 0。
- 否則,x ≠ 0
- 如果 fractionDigits 不是 undefined,則
- 令 e 和 n 爲整數,使得滿足 10f ≤ n < 10f+1 且 n × 10e-f - x 的準確數學值儘可能接近零。如果 e 和 n 有兩個這樣的組合,選擇使 n × 10e-f 更大的組合。
- 否則,fractionDigits 是 undefined
- 令 e、n 和 f 爲整數,使得滿足 f ≥ 0、10f≤ n < 10f+1、n × 10e-f 的 Number 值是 x,且 f 的值儘可能小。注:n 的十進制表示有 f + 1 個數字,n 不能被 10 整除,並且 n 的最少有效位數不一定唯一由這些條件確定。
- 令 m 爲由 n 的十進制表示裏的數 組成的字符串(沒有前導零)。
- 如果 fractionDigits 不是 undefined,則
- 如果 f ≠ 0,則
- 令 a 爲 m 中的第一個字符,令 b 爲 m 中的其餘字符。
- 令 m 爲串聯三個字符串 a、"." 的 b 的結果。
- 如果 e = 0,則
- 令 c = "+"。
- 令 d = "0"。
- 否則
- 如果 e > 0,則 令 c = "+"。
- 否則,e ≤ 0
- 令 c = "-"。
- 令 e = -e。
- 令 d 爲有 e 的十進制表示裏的數 組成的字符串(沒有前導零)。
- 令 m 爲串聯四個字符串 m、"e"、c 和 d 的結果。
- 返回串聯字符串 s 和 m 的結果。
toExponential 方法的 length 屬性是 1。
如果用多於一個參數調用 toExponential 方法,則行爲是未定義的(見15章)。
一個實現可以擴展 fractionDigits 的值小於 0 或大於 20 時 toExponential 的行爲。這種情況下對這樣的 fractionDigits 值,toExponential 不一定拋出 RangeError 異常。
- 令 e、n 和 f 爲整數,使得滿足 f ≥ 0,10f ≤ n < 10f+1,n × 10e-f 的 Number 值是 x,且 f 的值儘可能小。如果這樣的 n 值可能多個,選擇使 n × 10e-f 的值儘可能接近 x 的 n 值。如果有兩個這樣的 n 值,選擇偶數。
Number.prototype.toPrecision (precision)
返回一個字符串,它代表 this Number 值 的科學計數法(有效數字的小數點前有一個數字,有效數字的小數點後有 precision - 1 個數字)或十進制固定計數法(precision 個有效數字)。如果 precision 是 undefined,用 ToString 調用代替。具體來說執行以下步驟:
- 令 x 爲 this 數字值。
- 如果 precision 是 undefined,返回 ToString(x)。
- 令 p 爲 ToInteger(precision)。
- 如果 x 是 NaN,返回字符串 "NaN"。
- 令 s 爲空字符串。
- 如果 x < 0,則
- 令 s 爲 "-"。
- 令 x = -x。
- 如果 x = +∞,則
- 返回串聯字符串 s 和 "Infinity" 的結果。
- 如果 p < 1 或 p > 21,拋出一個 RangeError 異常。
- 如果 x = 0,則
- 令 m 爲 p 個 '0' 組成的字符串。
- 令 e = 0。
- 否則 x ≠ 0,
- 令 e 和 n 爲整數,使得滿足 10p-1 ≤ n < 10p 且 n × 10e-p+1 - x 的準確數學值儘可能接近零。如果 e 和 n 有兩個這樣的組合,選擇使 n × 10e-p+1 更大的組合。
- 令 m 爲由 n 的十進制表示裏的數 組成的字符串(沒有前導零)。
- 如果 e < -6 或 e ≥ p。則
- 令 a 爲 n 的第一個字符,令 b 爲 m 的其餘 p-1 個字符/
- 令 m 爲串聯三個字符串 a、"." 和 b 的結果。
- 如果 e = 0,則
- 令 c = "+",令 d = "0"。
- 否則 e ≠ 0,
- 如果 e > 0,則
- 令 c = "+"。
- 否則 e < 0,
- 令 c = "-"。
- 令 e = -e。
- 令 d 爲由 e 的十進制表示裏的數 組成的字符串(沒有前導零)。
- 如果 e > 0,則
- 令 m 爲串聯五個字符串 s、m、"e"、c 和 d 的結果。
- 如果 e = p - 1,則返回串聯字符串 s 和 m 的結果。
- 如果 e ≥ 0,則
- 令 m 爲 m 的前 e + 1 個字符,字符 '.',m 的其餘 p - (e + 1) 個字符 串聯的結果。
- 否則 e < 0,
- 令 m 爲 字符串 "0."、- (e + 1) 個字符 '0'、字符串 m 串聯的結果。
- 返回字符串 s 和 m 串聯的結果。
toPrecision 方法的 length 屬性是 1。
如果用多於一個參數調用 toPrecision 方法,則行爲是未定義的(見15章)。
一個實現可以擴展 precision 的值小於 1 或大於 21 時 toPrecision 的行爲。這種情況下對這樣的 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 對象不能作爲函數被調用。
Math 對象的值屬性
E
自然對數的底數 e 的 Number 值,約爲 2.7182818284590452354。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
LN10
10 的自然對數的 Number 值,約爲 2.302585092994046。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
LN2
2 的自然對數的 Number 值,約爲 0.6931471805599453。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
LOG2E
自然對數的底數 e 的以 2 爲底數的對數的 Number 值;約爲 1.4426950408889634。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
LOG10E
自然對數的底數 e 的以 10 爲底數的對數的 Number 值;約爲 0.4342944819032518。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
PI
圓的周長與直徑之比 π 的 Number 值,約爲 3.1415926535897932。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
SQRT1_2
½ 的平方根的 Number 值,約爲 0.7071067811865476。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
SQRT2
2 的平方根的 Number 值,約爲 1.4142135623730951。
此屬性有特性 { [[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false } 。
Math 對象的函數屬性
對以下每個 Math 對象函數的每個參數(如果有多個,以左到右的順序)應用 ToNumber 抽象操作,然後對結果 Number 值執行計算。
下面對函數的描述中,符號 NaN、-0、+0、-∞、+∞ 指 8.5 描述的 Number 值。
儘管算法的選擇由實現來決定的,但它被推薦(不是由這個標準指定)使用包含在fdlibm的IEEE754算法的近似算法來實現,這個可以自由分配的數學庫來自Sun公司(http://www.netlib.org/fdlibm).
abs (x)
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 -0,返回結果是 +0。
- 若 x 是 -∞,返回結果是 +∞。
acos (x)
返回 x 的反餘弦的依賴實現的近似值。結果以弧度形式表示,範圍是 +0 到 +π。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 大於 1,返回結果是 NaN。
- 若 x 小於 -1,返回結果是 NaN。
- 若 x 正好是 1,返回結果是 +0。
asin (x)
返回 x 的反正弦的依賴實現的近似值。結果以弧度形式表示,範圍是 -π/2 到 +π/2。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 大於 1,返回結果是 NaN。
- 若 x 小於 –1,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
atan (x)
返回 x 的反正切的依賴實現的近似值。結果以弧度形式表示,範圍是 -π/2 到 +π/2。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞,返回結果是 一個依賴於實現的近似值 +π/2。
- 若 x 是 -∞,返回結果是 一個依賴於實現的近似值 -π/2。
atan2 (y, x)
返回 參數 y 和 x 的商 y / x 的反正切 的依賴實現的近似值,y 和 x 的符號用於確定返回值的象限。注:命名爲 y 的參數爲第一個,命名爲 x 的參數爲第二個,這是有意的,是反正切函數倆參數的慣例。結果以弧度形式表示,範圍是 -π 到 +π。
- 若 x 和 y 至少一個是 NaN,返回結果是 NaN。
- 若 y > 0 且 x 是 +0,返回結果是 一個依賴於實現的近似值 +π/2。
- 若 y > 0 且 x 是 -0,返回結果是 一個依賴於實現的近似值 +π/2。
- 若 y 是 +0 且 x > 0,返回結果是 +0。
- 若 y 是 +0 且 x 是 +0,返回結果是 +0。
- 若 y 是 +0 且 x 是 -0,返回結果是 一個依賴於實現的近似值 +π。
- 若 y 是 +0 且 x < 0,返回結果是 一個依賴於實現的近似值 +π。
- 若 y 是 -0 且 x > 0,返回結果是 -0。
- 若 y 是 -0 且 x 是 +0,返回結果是 -0。
- 若 y 是 -0 且 x 是 -0,返回結果是 一個依賴於實現的近似值 -π。
- 若 y 是 -0 且 x < 0,返回結果是 一個依賴於實現的近似值 -π。
- 若 y < 0 且 x 是 +0,返回結果是 一個依賴於實現的近似值 -π/2。
- 若 y < 0 且 x 是 -0,返回結果是 一個依賴於實現的近似值 -π/2。
- 若 y > 0 且 y 是 有限的 且 x 是 +∞,返回結果是 +0。
- 若 y > 0 且 y 是 有限的 且 x 是 -∞,返回結果是 一個依賴於實現的近似值 +π。
- 若 y < 0 且 y 是 有限的 且 x 是 +∞,返回結果是 -0。
- 若 y < 0 且 y 是 有限的 且 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 已是整數,則返回 x。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞,返回結果是 +∞。
- 若 x 是 -∞,返回結果是 -∞。
- 若 x 小於 0 但大於 -1,返回結果是 -0。
cos (x)
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 1。
- 若 x 是 -0,返回結果是 1。
- 若 x 是 +∞,返回結果是 NaN。
- 若 x 是 -∞,返回結果是 NaN。
exp (x)
返回 x 的指數的依賴實現的近似值(e 爲 x 次方,e 爲自然對數的底)。
- 若 x 是 NaN, 返回結果是 NaN.
- 若 x 是 +0, 返回結果是 1.
- 若 x 是 -0, 返回結果是 1.
- 若 x 是 +∞, 返回結果是 +∞.
- 若 x 是 -∞, 返回結果是 +0.
floor (x)
返回不大於 x 的且爲數學整數的最大 ( 接近 +∞ ) Number 值。如果 x 已是整數,則返回 x。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞,返回結果是 +∞。
- 若 x 是 -∞,返回結果是 -∞。
- 若 x 大於 0 但小於 1,返回結果是 +0。
log (x)
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 小於 0,返回結果是 NaN。
- 若 x 是 +0 或 -0,返回結果是 -∞。
- 若 x 是 1,返回結果是 +0。
- 若 x 是 +∞,返回結果是 +∞。
max ( [ value1 [ , value2 [ , … ] ] ] )
給定零或多個參數,對每個參數調用 ToNumber 並返回調用結果裏的最大值。
- 若 沒有給定參數,返回結果是 -∞。
- 若 任何值是 NaN,返回結果是 NaN。
- 按照 11.8.5 指定方式進行值比較,確定最大值,與 11.8.5 指定方式的一個不同點是在這裏 +0 被看作大於 -0。
max 方法的 length 屬性是 2。
min ( [ value1 [ , value2 [ , … ] ] ] )
給定零或多個參數,對每個參數調用 ToNumber 並返回調用結果裏的最小值。
- 若 沒有給定參數,返回結果是 +∞。
- 若 任何值是 NaN,返回結果是 NaN。
- 按照 11.8.5 指定方式進行值比較,確定最小值,與 11.8.5 指定方式的一個不同點是在這裏 +0 被看作大於 -0。
min 方法的 length 屬性是 2。
pow (x, y)
- 若 y 是 NaN,返回結果是 NaN。
- 若 y 是 +0,返回結果是 1,即使 x 是 NaN。
- 若 y 是 -0,返回結果是 1,即使 x 是 NaN。
- 若 x 是 NaN 且 y 是 非零,返回結果是 NaN。
- 若 abs(x) > 1 且 y 是 +∞,返回結果是 +∞。
- 若 abs(x) > 1 且 y 是 -∞,返回結果是 +0。
- 若 abs(x) == 1 且 y 是 +∞,返回結果是 NaN。
- 若 abs(x) == 1 且 y 是 -∞,返回結果是 NaN。
- 若 abs(x) < 1 且 y 是 +∞,返回結果是 +0。
- 若 abs(x) < 1 且 y 是 -∞,返回結果是 +∞。
- 若 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 是 +0 且 y > 0,返回結果是 +0。
- 若 x 是 +0 且 y < 0,返回結果是 +∞。
- 若 x 是 -0 且 y > 0 且 y 是 一個奇數,返回結果是 -0。
- 若 x 是 -0 且 y > 0 且 y 不是 一個奇數,返回結果是 +0。
- 若 x 是 -0 且 y < 0 且 y 是 一個奇數,返回結果是 -∞。
- 若 x 是 -0 且 y < 0 且 y 不是 一個奇數,返回結果是 +∞。
- 若 x < 0 且 x 是有限的 且 y 是有限的 且 y 不是整數,返回結果是 NaN。
random ( )
返回一個大於或等於 0 但小於 1 的符號爲正的 Number 值,選擇隨機或在該範圍內近似均勻分佈的僞隨機,用一個依賴與實現的算法或策略。此函數不需要參數。
round (x)
返回最接近 x 且爲數學整數的 Number 值。如果兩個整數同等接近 x,則結果是接近 +∞ 的 Number 值 。如果 x 已是整數,則返回 x。
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞,返回結果是 +∞。
- 若 x 是 -∞,返回結果是 -∞。
- 若 x 大於 0 但小於 0.5,返回結果是 +0。
- 若 x 小於 0 但大於或等於 -0.5,返回結果是 -0。
sin (x)
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞ 或 -∞,返回結果是 NaN。
sqrt (x)
- 若 x 是 NaN,返回結果是 NaN。
- 若 x 小於 0,返回結果是 NaN。
- 若 x 是 +0,返回結果是 +0。
- 若 x 是 -0,返回結果是 -0。
- 若 x 是 +∞,返回結果是 +∞。
tan (x)
- 若 x 是 NaN,返回結果是 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,991 到 9,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 所屬的天數是
Day(t) = floor(t / msPerDay)
其中每天的毫秒數是
msPerDay = 86400000
餘數叫做天內時間
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 年第一天的天數是 :
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 }
月數
月份是由閉區間 0 到 11 內的一個整數確定。一個時間值 t 到一個月數的映射 MonthFromTime(t) 的定義爲:
MonthFromTime(t) = 0 如果 0 ≤ DayWithinYear(t) < 31 = 1 如果 31 ≤ DayWithinYear (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 日,星期四。
日期數
一個日期數用閉區間 1 到 31 內的一個整數標識。從一個時間值 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)
小時、分鐘、秒、毫秒
以下函數用於分解時間值:
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
HoursPerDay = 24 MinutesPerHour = 60 SecondsPerMinute = 60 msPerSecond = 1000 msPerMinute = 60000 = msPerSecond × SecondsPerMinute msPerHour = 3600000 = msPerMinute × MinutesPerHour
MakeTime (hour, min, sec, ms)
MakeTime 抽象操作用它的四個參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:
- 如果 hour 不是有限的或 min 不是有限的或 sec 不是有限的或 ms 不是有限的,返回 NaN。
- 令 h 爲 ToInteger(hour)。
- 令 m 爲 ToInteger(min)。
- 令 s 爲 ToInteger(sec)。
- 令 milli 爲 ToInteger(ms)。
- 令 t 爲 h × msPerHour + m × msPerMinute + s × msPerSecond + milli,執行的四則運算根據 IEEE 754 規則(這就像使用 ECMAScript 運算符 × 和 + 一樣)。
- 返回 t。
MakeDay (year, month, date)
MakeDay 抽象操作用它的三個參數算出一個天數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:
- 如果 year 不是有限的或 month 不是有限的或 date 不是有限的,返回 NaN。
- 令 y 爲 ToInteger(year)。
- 令 m 爲 ToInteger(month)。
- 令 dt 爲 ToInteger(date)。
- 令 ym 爲 y + floor(m / 12)。
- 令 mn 爲 m modulo 12。
- 找一個滿足 YearFromTime(t) == ym 且 MonthFromTime(t) == mn 且 DateFromTime(t) == 1 的 t 值;但如果這些條件是不可能的(因爲有些參數超出了範圍),返回 NaN。
- 返回 Day(t) + dt - 1。
MakeDate (day, time)
MakeDate 抽象操作用它的兩個參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:
- 如果 day 不是有限的或 time 不是有限的,返回 NaN。
- 返回 day × msPerDay + time。
TimeClip (time)
TimeClip 抽象操作用它的參數算出一個毫秒數,參數必須是 ECMAScript 數字值。此抽象操作運行如下:
- 如果 time 不是有限的 , 返回 NaN。
- 如果 abs(time) > 8.64×1015, 返回 NaN。
- 返回 ToInteger(time) 和 ToInteger(time) + (+0) 之一,這依賴於實現 ( 加正一是爲了將 -0 轉換成 +0 )。
日期時間字符串格式
ECMAScript 定義了一個基於簡化的 ISO 8601 擴展格式的日期時間的字符串互換格式,格式爲:YYYY-MM-DDTHH:mm:ss.sssZ
其中個字段爲:
YYYY | 是公曆中年的十進制數字。 |
- | 在字符串中直接以“-”(連字符)出現兩次。 |
MM | 是一年中的月份,從 01(一月)到 12(十二月)。 |
DD | 是月份中的日期,從 01 到 31。 |
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
所有數字必須是十進制的。如果缺少 MM 或 DD 字段,用 “01” 作爲它們的值。如果缺少 mm 或 ss 字段,用 “00” 作爲它們的值,對於缺少的 sss 用 “000” 作爲它的值。對於缺少的時區偏移量用 “Z”。
一個格式字符串裏有非法值(越界以及語法錯誤),意味着這個格式字符串不是有效的本節描述格式的實例。
擴展的年
ECMAScript 需要能表示6位數年份(擴展的年份)的能力;協調世界時 1970年1月1日 前後分別約 285,616 年。對於表示 0年 之前或 9999年 之後的年份,ISO 8601 允許對年的表示法進行擴展,但只能在發送和接受信息的雙方有事先共同約定的情況下才能擴展。在已經簡化的 ECMAScript 的格式中這樣擴展的年份表示法有2個額外的數字和始終存在的前綴符號 + 或 - 。0年 被認爲是正的,因此用 + 符號作爲前綴。
作爲函數調用 Date 構造器
當把 Date 作爲函數來調用,而不作爲構造器,它返回一個表示當前時間(協調世界時)的字符串。
Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] )
所有參數都是可選的;接受提供的任何參數,但被完全忽略。返回一個彷彿是用表達式 (new Date()).toString() 創建的字符串,這裏的 Date 是標準內置構造器,toString 是標準內置方法 Date.prototype.toString。
Date 構造器
當把 Date 作爲 new 表達式的一部分來調用,它是個構造器:它初始化新創建的對象。
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
當用二到七個參數調用 Date 構造器,它用 year、month 還有(可選的)date、hours、minutes、seconds、ms 來計算時間。
新構造對象的 [[Prototype]] 內部屬性設定爲原始的時間原型對象,它是 Date.prototype 的初始值。
新構造對象的 [[Class]] 內部屬性設定爲 "Date"。
新構造對象的 [[Extensible]] 內部屬性設定爲 ture。
新構造對象的 [[PrimitiveValue]] 內部屬性按照以下步驟設定:
- 令 y 爲 ToNumber(year)。
- 令 m 爲 ToNumber(month)。
- 如果提供了 date,則令 dt 爲 ToNumber(date);否則令 dt 爲 1。
- 如果提供了 hours,則令 h 爲 ToNumber(hours);否則令 h 爲 0。
- 如果提供了 minutes,則令 min 爲 ToNumber(minutes);否則令 min 爲 0。
- 如果提供了 seconds,則令 s 爲 ToNumber(seconds);否則令 s 爲 0。
- 如果提供了 ms,則令 milli 爲 ToNumber(ms);否則令 milli 爲 0。
- 如果 y 不是 NaN 且 0 ≤ ToInteger(y) ≤ 99,則令 yr 爲 1900+ToInteger(y);否則令 yr 爲 y。
- 令 finalDate 爲 MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))。
- 設定新構造對象的 [[PrimitiveValue]] 內部屬性爲 TimeClip(UTC(finalDate))。
new Date (value)
新構造對象的 [[Prototype]] 內部屬性設定爲原始的時間原型對象,它是 Date.prototype 的初始值。
新構造對象的 [[Class]] 內部屬性設定爲 "Date"。
新構造對象的 [[Extensible]] 內部屬性設定爲 ture。
新構造對象的 [[PrimitiveValue]] 內部屬性按照以下步驟設定:
- 令 v 爲 ToPrimitive(value)。
- 如果
Type(v) 是 String,則
- 用與 parse 方法 (15.9.4.2) 完全相同的方式將 v 解析爲一個日期時間;令 V 爲這個日期時間的時間值。
- 否則,令 V 爲 ToNumber(v)。
- 設定新構造對象的 [[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 原型對象。
此屬性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Date.parse (string)
parse 函數對它的參數應用 ToString 操作並將結果字符串解釋爲一個日期和時間;返回一個數字值,是對應這個日期時間的 UTC 時間值。字符串可解釋爲本地時間,UTC 時間,或某個其他時區的時間,這取決於字符串裏的內容。此函數首先嚐試根據日期時間字符串格式(15.9.1.15)裏的規則來解析字符串的格式。如果字符串不符合這個格式此函數可回退,用任意實現定義的試探方式或日期格式。無法識別的字符串或日期時間包含非法元素值,將導致 Date.parse 返回 NaN。
在所有屬性都指向它們的初始值的情況下,如果 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 的產生值是依賴於實現,並且在同一實現中 toString 或 toUTCString 方法不能產生不符合日期時間字符串格式的字符串。
Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ])
當用少於兩個的參數調用 UTC 函數時,它的行爲是依賴於實現的。當用二到七個參數調用 UTC 函數,它從 year、month 和(可選的)date、hours、minutes、seconds、ms 計算出日期時間。採用以下步驟:
- 令 y 爲 ToNumber(year)。
- 令 m 爲 ToNumber(month)。
- 如果提供了 date,則令 dt 爲 ToNumber(date);否則令 dt 爲 1。
- 如果提供了 hours,則令 h 爲 ToNumber(hours);否則令 h 爲 0。
- 如果提供了 minutes,則令 min 爲 ToNumber(minutes);否則令 min 爲 0。
- 如果提供了 seconds,則令 s 爲 ToNumber(seconds);;否則令 s 爲 0。
- 如果提供了 ms,則令 milli 爲 ToNumber(ms);否則令 milli 爲 0。
- 如果 y 不是 NaN 且 0 ≤ ToInteger(y) ≤ 99,則令 yr 爲 1900 + ToInteger(y);否則令 yr 爲 y。
- 返回 TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))。
UTC 函數的 length 屬性是 7。
Date.now ( )
now 函數返回一個數字值,它表示調用 now 時的 UTC 日期時間的時間值。
Date 原型對象的屬性
Date 原型對象自身是一個 Date 對象(其 [[Class]] 是 "Date"),其 [[PrimitiveValue]] 是 NaN 。
Date 原型對象的 [[Prototype]] 內部屬性的值是標準內置 Object 原型對象。
在以下對 Date 原型對象的函數屬性的描述中,短語“this Date 對象”指調用函數時的 this 值對象。除非另外說明,這些函數不是通用的;如果 this 值不是 [[Class]] 內部屬性爲 "Date" 的對象,則拋出一個 TypeError 異常。短語“this 時間值”指代表 this Date 對象 的時間值的數字值,它是 this Date 對象 的 [[PrimitiveValue]] 內部屬性的值。
Date.prototype.constructor
Date.prototype.constructor 的初始值是內置 Date 構造器。
Date.prototype.toString ( )
此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區的時間。
Date.prototype.toDateString ( )
此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區時間的“日期”部分。
Date.prototype.toTimeString ( )
此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示當前時區時間的“時間”部分。
Date.prototype.toLocaleString ( )
這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date。
Date.prototype.toLocaleDateString ( )
這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date 的日期部分。
Date.prototype.toLocaleTimeString ( )
這個函數返回一個 String 值。String 的內容由實現決定,但它的目的是使用一種與宿主環境的語言習慣對應的人類可讀形式來方便地表述當前時區中的 Date 的時間部分。
Date.prototype.valueOf ( )
valueOf 函數返回一個數字值,它是 this 時間值。
Date.prototype.getTime ( )
Date.prototype.getFullYear ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 YearFromTime(LocalTime(t))。
Date.prototype.getUTCFullYear ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 YearFromTime(t)。
Date.prototype.getMonth ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 MonthFromTime(LocalTime(t))。
Date.prototype.getUTCMonth ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 MonthFromTime(t)。
Date.prototype.getDate ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 DateFromTime(LocalTime(t))。
Date.prototype.getUTCDate ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 DateFromTime(t)。
Date.prototype.getDay ( )
Date.prototype.getUTCDay ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 WeekDay(t)。
Date.prototype.getHours ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 HourFromTime(LocalTime(t))。
Date.prototype.getUTCHours ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 HourFromTime(t)。
Date.prototype.getMinutes ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 MinFromTime(LocalTime(t))。
Date.prototype.getUTCMinutes ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 MinFromTime(t)。
Date.prototype.getSeconds ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 SecFromTime(LocalTime(t))。
Date.prototype.getUTCSeconds ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 SecFromTime(t)。
Date.prototype.getMilliseconds ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 msFromTime(LocalTime(t))。
Date.prototype.getUTCMilliseconds ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 msFromTime(t)。
Date.prototype.getTimezoneOffset ( )
- 令 t 爲 this 時間值。
- 如果 t 是 NaN,返回 NaN。
- 返回 ( t - LocalTime(t) ) / msPerMinute )。
Date.prototype.setTime (time)
- 令 v 爲 TimeClip(ToNumber(time))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
Date.prototype.setMilliseconds (ms)
- 令 t 爲 LocalTime(this 時間值) 的結果。
- 令 time 爲 MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms))。
- 令 u 爲 TimeClip(UTC(MakeDate(Day(t), time)))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
Date.prototype.setUTCMilliseconds (ms)
- 令 t 爲 this 時間值。
- 令 time 爲 MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms))。
- 令 v 爲 TimeClip(MakeDate(Day(t), time))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
Date.prototype.setSeconds (sec [, ms ] )
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。
- 令 t 爲 LocalTime( this 時間值 ) 的結果。
- 令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
- 令 u 爲 TimeClip(UTC(date))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
setSeconds 方法的 length 屬性是 2。
Date.prototype.setUTCSeconds (sec [, ms ] )
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。
- 令 t 爲 this 時間值。
- 令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
- 令 v 爲 TimeClip(date)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
setUTCSeconds 方法的 length 屬性是 2。
Date.prototype.setMinutes (min [, sec [, ms ] ] )
沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getSeconds() 的結果一樣。
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。
- 令 t 爲 LocalTime( this 時間值 ) 的結果。
- 令 m 爲 ToNumber(min)。
- 如果沒指定 sec,則令 s 爲 SecFromTime(t);否則,令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t),MakeTime(HourFromTime(t), m, s, milli))。
- 令 u 爲 TimeClip(UTC(date))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
setMinutes 方法的 length 屬性是 3。
Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )
沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getUTCSeconds() 的結果一樣。
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。
- 令 t 爲 this 時間值。
- 令 m 爲 ToNumber(min)。
- 如果沒指定 sec,則令 s 爲 SecFromTime(t);否則,令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t),MakeTime(HourFromTime(t), m, s, milli))。
- 令 v 爲 TimeClip(date)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
setUTCMinutes 方法的 length 屬性是 3。
Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )
沒指定 min 參數時的行爲是,彷彿 min 被指定爲調用 getMinutes() 的結果一樣。
沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getSeconds() 的結果一樣。
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getMilliseconds() 的結果一樣。
- 令 t 爲 LocalTime( this 時間值 ) 的結果。
- 令 h 爲 ToNumber(hour)。
- 如果沒指定 min,則令 m 爲 MinFromTime(t);否則,令 m 爲 ToNumber(min)。
- 如果沒指定 sec,則令 s 爲 SecFromTime(t);否則,令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t), MakeTime(h, m, s, milli))。
- 令 u 爲 TimeClip(UTC(date))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
setHours 方法的 length 屬性是 4。
Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )
沒指定 min 參數時的行爲是,彷彿 min 被指定爲調用 getUTCMinutes() 的結果一樣。
沒指定 sec 參數時的行爲是,彷彿 sec 被指定爲調用 getUTCSeconds() 的結果一樣。
沒指定 ms 參數時的行爲是,彷彿 ms 被指定爲調用 getUTCMilliseconds() 的結果一樣。
- 令 t 爲 this 時間值。
- 令 h 爲 ToNumber(hour)。
- 如果沒指定 min,則令 m 爲 MinFromTime(t);否則,令 m 爲 ToNumber(min)。
- 如果沒指定 sec,則令 s 爲 SecFromTime(t);否則,令 s 爲 ToNumber(sec)。
- 如果沒指定 ms,則令 milli 爲 msFromTime(t);否則,令 milli 爲 ToNumber(ms)。
- 令 date 爲 MakeDate(Day(t), MakeTime(h, m, s, milli))。
- 令 v 爲 TimeClip(date)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
setUTCHours 方法的 length 屬性是 4。
Date.prototype.setDate (date)
- 令 t 爲 LocalTime( this 時間值 ) 的結果。
- 令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
- 令 u 爲 TimeClip(UTC(newDate))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
Date.prototype.setUTCDate (date)
- 令 t 爲 this 時間值。
- 令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
- 令 v 爲 TimeClip(newDate)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
Date.prototype.setMonth (month [, date ] )
沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getDate() 的結果一樣。
- 令 t 爲 LocalTime( this 時間值 ) 的結果。
- 令 m 爲 ToNumber(month)。
- 如果沒指定 date,則令 dt 爲 DateFromTime(t);否則,令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
- 令 u 爲 TimeClip(UTC(newDate))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
setMonth 方法的 length 屬性是 2。
Date.prototype.setUTCMonth (month [, date ] )
沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getUTCDate() 的結果一樣。
- 令 t 爲 this 時間值。
- 令 m 爲 ToNumber(month)。
- 如果沒指定 date,則令 dt 爲 DateFromTime(t);否則,令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
- 令 v 爲 TimeClip(newDate)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
setUTCMonth 方法的 length 屬性是 2。
Date.prototype.setFullYear (year [, month [, date ] ] )
沒指定 month 參數時的行爲是,彷彿 month 被指定爲調用 getMonth() 的結果一樣。
沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getDate() 的結果一樣。
- 令 t 爲 LocalTime( this 時間值 ) 的結果;但如果 this 時間值 是 NaN,則令 t 爲 +0。
- 令 y 爲 ToNumber(year)。
- 如果沒指定 month,則令 m 爲 MonthFromTime(t);否則,令 m 爲 ToNumber(month)。
- 如果沒指定 date,則令 dt 爲 DateFromTime(t);否則,令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
- 令 u 爲 TimeClip(UTC(newDate))。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 u。
- 返回 u。
setFullYear 方法的 length 屬性是 3。
Date.prototype.setUTCFullYear (year [, month [, date ] ] )
沒指定 month 參數時的行爲是,彷彿 month 被指定爲調用 getUTCMonth() 的結果一樣。
沒指定 date 參數時的行爲是,彷彿 date 被指定爲調用 getUTCDate() 的結果一樣。
- 令 t 爲 this 時間值;但如果 this 時間值 是 NaN,則令 t 爲 +0。
- 令 y 爲 ToNumber(year)。
- 如果沒指定 month,則令 m 爲 MonthFromTime(t);否則,令 m 爲 ToNumber(month)。
- 如果沒指定 date,則令 dt 爲 DateFromTime(t);否則,令 dt 爲 ToNumber(date)。
- 令 newDate 爲 MakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
- 令 v 爲 TimeClip(newDate)。
- 設定 this Date 對象 的 [[PrimitiveValue]] 內部屬性爲 v。
- 返回 v。
setUTCFullYear 方法的 length 屬性是 3。
Date.prototype.toUTCString ( )
此函數返回一個字符串值。字符串中內容是依賴於實現的,但目的是用一種方便,人類可讀的形式表示 UTC 時間。
Date.prototype.toISOString ( )
此函數返回一個代表 this Date 對象表示的時間實例 的字符串。字符串的格式是 15.9.1.15 定義的日期時間字符串格式。字符串中包含所有的字段。字符串表示的時區總是 UTC,用後綴 Z 標記。如果 this 對象的時間值不是有限的數字值,拋出一個 RangeError 異常。
Date.prototype.toJSON ( key )
此函數爲 JSON.stringify (15.12.3) 提供 Date 對象的一個字符串表示。
當用參數 key 調用 toJSON 方法,採用以下步驟:
- 令 O 爲 以 this 值爲參數調用 ToObject 的結果。
- 令 tv 爲 ToPrimitive(O, 暗示 Number)。
- 如果 tv 是一個數字值且不是有限的,返回 null。
- 令 toISO 爲以 "toISOString" 爲參數調用 O 的 [[Get]] 內部方法的結果。
- 如果 IsCallable(toISO) 是 false,拋出一個 TypeError 異常。
- O 作爲以 this 值並用空參數列表調用 toISO 的 [[Call]] 內部方法,返回結果。
Date 實例的屬性
Date 實例從 Date 原型對象繼承屬性,Date 實例的 [[Class]] 內部屬性值是 "Date"。Date 實例還有一個 [[PrimitiveValue]] 內部屬性。
[[PrimitiveValue]] 內部屬性是代表 this Date 對象 的時間值。
RegExp 對象
一個 RegExp 對象包含一個正則表達式和關聯的標誌。
模式(Patterns)
RegExp 構造器對輸入模式字符串應用以下文法。如果文法無法將字符串解釋爲 Pattern 的一個展開形式,則發生錯誤。
語法:
Pattern :: Disjunction
Disjunction :: Alternative Alternative | Disjunction
Alternative :: [empty] Alternative Term
Term :: Assertion Atom Atom Quantifier
Assertion :: ^ $ \ b \ B ( ? = Disjunction ) ( ? ! Disjunction )
Quantifier :: QuantifierPrefix QuantifierPrefix ?
QuantifierPrefix :: * + ? { DecimalDigits } { DecimalDigits , } { DecimalDigits , DecimalDigits }
Atom :: PatternCharacter . \ AtomEscape CharacterClass ( Disjunction ) ( ? : Disjunction )
PatternCharacter :: SourceCharacter but not one of ^ $ \ . * + ? ( ) [ ] { } |
AtomEscape :: DecimalEscape CharacterEscap CharacterClassEscape
CharacterEscape :: ControlEscape c ControlLetter HexEscapeSequence UnicodeEscapeSequence IdentityEscape
ControlEscape :: one of f n r t v
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
CharacterClass :: [ [lookahead ∉ {^}] ClassRanges ] [ ^ ClassRanges ]
ClassRanges :: [empty] NonemptyClassRanges
NonemptyClassRanges :: ClassAtom ClassAtom NonemptyClassRangesNoDash ClassAtom - ClassAtom ClassRanges
NonemptyClassRangesNoDash :: ClassAtom ClassAtomNoDash NonemptyClassRangesNoDash ClassAtomNoDash - ClassAtom ClassRanges
ClassAtom :: - ClassAtomNoDash
ClassAtomNoDash :: SourceCharacter but not \、]、- \ ClassEscape
ClassEscape :: DecimalEscape b 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 按照以下方式解釋執行 :
- 解釋執行 Disjunction ,獲得一個 Matcher m。
- 返回一個需要兩個參數的內部閉包,一個字符串 str 和一個整數 index,執行方式如下:
- 令 Input 爲給定的字符串 str。15.10.2 中的算法都將用到此變量。
- 令 InputLength 爲 Input 的長度。15.10.2 中的算法都將用到此變量。
- 令 c 爲 一個 Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult。
- 令 cap 爲一個有 NcapturingParens 個 undefined 值的內部數組,索引是從 1 到 NcapturingParens。
- 令 x 爲 State(index, cap)。
- 調用 m(x, c),並返回結果。
析取(Disjunction)
產生式 Disjunction :: Alternative 的解釋執行,是解釋執行 Alternative 來獲得 Matcher 並返回這個 Matcher。
產生式 Disjunction :: Alternative | Disjunction 按照以下方式解釋執行:
- 解釋執行 Alternative 來獲得一個 Matcher m1。
- 解釋執行 Disjunction 來獲得一個 Matcher m2。
- 返回一個需要兩個參數的內部閉包
Matcher,參數分別是一個
State x 和一個
Continuation c,此內部閉包的執行方式如下:
- 調用 m1(x, c) 並令 r 爲其結果。
- 如果 r 不是 failure,返回 r。
- 調用 m2(x, c) 並返回其結果。
/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 按照如下方式解釋執行:
- 解釋執行 Alternative 來獲得一個 Matcher m1。
- 解釋執行 Term 來獲得一個 Matcher m2。
- 返回一個內部閉包
Matcher,它需要兩個參數,一個
State x 和一個
Continuation c,執行方式如下 :
- 創建一個 Continuation d,它需要一個 State 參數 y,返回調用 m2(y,c) 的結果。
- 調用 m1(x, d) 並返回結果。
匹配項(Term)
產生式 Term :: Assertion 解釋執行,返回一個需要兩個參數 State x 和 Continuation c 的內部閉包 Matcher,它的執行方式如下:
- 解釋執行 Assertion 來獲得一個 AssertionTester t。
- 調用 t(x) 並令 r 爲調用結果布爾值。
- 如果 r 是 false,返回 failure。
- 調用 c(x) 並返回結果。
產生式 Term :: Atom 的解釋執行方式是,解釋執行 Atom 來獲得一個 Matcher 並返回這個 Matcher。
產生式 Term :: Atom Quantifier 的解釋執行方式如下 :
- 解釋執行 Atom 來獲得一個 Matcher m。
- 解釋執行 Quantifier 來獲得三個結果值:一個整數 min,一個整數(或 ∞)max,和一個布爾值 greedy。
- 如果 max 是有限的 且小於 min,則拋出一個 SyntaxError 異常。
- 令 parenIndex 爲整個正則表達式中在此產生式 Term 展開形式左側出現的左匹配括號的數目。這是此產生式 Term 前面展開的 Atom :: ( Disjunction ) 產生式總數與此 Term 裏面的 Atom :: ( Disjunction ) 產生式總數之和。
- 令 parenCount 爲在展開的 Atom 產生式裏的左捕獲括號數目。這是 Atom 產生式裏面 Atom :: ( Disjunction ) 產生式的總數。
- 返回一個需要兩個參數
State x 和
Continuation c 的內部閉包
Matcher,執行方式如下:
- 調用 RepeatMatcher(m, min, max, greedy, x, c, parenIndex, parenCount),並返回結果。
抽象操作 RepeatMatcher 需要八個參數,一個 Matcher m,一個整數 min,一個整數(或 ∞)max,一個布爾值 greedy,一個 State x,一個 Continuation c,一個整數 parenIndex,一個整數 parenCount,執行方式如下:
- 如果 max 是零,則調用 c(x),並返回結果。
- 創建需要一個
State 參數 y 的內部
Continuation 閉包 d,執行方式如下:
- 如果 min 是零 且 y 的 endIndex 等於 x 的 endIndex,則返回 failure。
- 如果 min 是零,則令 min2 爲零;否則令 min2 爲 min-1。
- 如果 max 是 ∞,則令 max2 爲 ∞;否則令 max2 爲 max-1。
- 調用 RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount),並返回結果。
- 令 cap 爲 x 的捕獲內部數組的一個拷貝。
- 對所有滿足條件 parenIndex < k 且 k ≤ parenIndex+parenCount 的整數 k,設定 cap[k] 爲 undefined。
- 令 e 爲 x 的 endIndex。
- 令 xr 爲 State 值 (e, cap)。
- 如果 min 不是零,則調用 m(xr, d),並返回結果。
- 如果 greedy 是 false,則
- 令 z 爲調用 c(x) 的結果。
- 如果 z 不是 failure,返回 z。
- 調用 m(xr, d),並返回結果。
- 令 z 爲調用 m(xr, d) 的結果。
- 如果 z 不是 failure,返回 z。
- 調用 c(x),並返回結果。
斷言(Assertion)
產生式 Assertion :: ^ 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:
- 使 e 爲 x的 endIndex。
- 若 e = 0,返回 true。
- 若 Multiline 爲 false,返回 false。
- 若 Input[e - 1] 的字符爲 LineTerminator,返回 true。
- 返回 false。
產生式 Assertion :: $ 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:
- 使 e 爲 x 的 endIndex
- 若 e = InputLength,返回 true。
- 若 Multiline 爲 false,返回 false。
- 若 Input[e] 的字符爲 LineTerminator,返回 true。
- 返回 false。
產生式 Assertion :: \ b 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:
- 使 e 爲 x 的 endIndex。
- 調用 IsWordChar(e - 1),返回 Boolean 值賦給 a。
- 調用 IsWordChar(e),返回 Boolean 值賦給 b。
- 若 a 爲 true,b 爲 false,返回 true。
- 若 a 爲 false,b 爲 true,返回 true。
- 返回 false。
產生式 Assertion :: \ B 解釋執行返回一個 AssertionTester,它需要1個參數 State x,並按如下算法執行:
- 使 e 爲 x 的 endIndex。
- 調用 IsWordChar(e - 1),返回 Boolean 值賦給 a。
- 調用 IsWordChar(e),返回 Boolean 值賦給 b。
- 若 a 爲 true,b 爲 false,返回 false。
- 若 a 爲 false,b 爲 true,返回 false。
- 返回 true。
產生式 Assertion :: (? = Disjunction ) 按如下算法執行:
- 執行 Disjunction,得到 Matcher m。
- 返回一個需要兩個參數的內部閉包
Matcher,參數分別是一個
State x 和一個
Continuation c,此內部閉包的執行方式如下:
- 使 d 爲一個Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult。
- 調用 m(x, d),令 r 爲其結果。
- 若 r 爲 failure,返回 failure。
- 使 y 爲 r 的 State。
- 使 cap 爲 r 的captures。
- 使 xe 爲 r 的endIndex。
- 使 z 爲 State (xe, cap)。
- 調用 c(z),返回結果。
產生式 Assertion :: (? ! Disjunction ) 按如下算法執行:
- 執行 Disjunction,得到 Matcher m。
- 返回一個需要兩個參數的內部閉包
Matcher,參數分別是一個
State x 和一個
Continuation c,此內部閉包的執行方式如下:
- 使 d 爲一個 Continuation,它始終對它的任何 State 參數都返回成功匹配的 MatchResult。
- 調用 m(x, d),令 r 爲其結果。
- 若r爲failure,返回 failure。
- 調用 c(z),返回結果。
抽象操作 IsWordChar,擁有一個整數類型的參數 e,按如下方式執行:
- 若 e == -1 或 e == InputLength,返回 false。
- 令 c 爲 Input[e]。
- 若 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 _。 - 返回 false。
量詞(Quantifier)
產生式 Quantifier :: QuantifierPrefix 按如下方式執行:
- 執行 QuantifierPrefix 得到 2 個數 min 和 max(或 ∞)。
- 返回 min、max、true。
產生式 Quantifier :: QuantifierPrefix ? 按如下方式執行:
- 執行 QuantifierPrefix 得到 2 個數 min 和 max(或 ∞)。
- 返回 min、max、false。
產生式 Quantifier :: * 返回 0 和 ∞
產生式 Quantifier :: + 返回 1 和 ∞
產生式 Quantifier :: ? 返回 0 和 1
產生式 Quantifier :: { DecimalDigits } 按如下方式執行:
- 令 i 爲 DecimalDigits 的數學值。
- 返回 i、i。
產生式 Quantifier :: { DecimalDigits , } 按如下方式執行:
- 令 i 爲 DecimalDigits 的數學值。
- 返回 i、∞。
產生式 Quantifier :: { DecimalDigits , DecimalDigits } 按如下方式執行:
- 令 i 爲 DecimalDigits 的數學值。
- 令 j 爲 DecimalDigits 的數學值。
- 返回 i、j。
原子(Atom)
產生式 Atom :: PatternCharacter 執行方式如下:
- 令 ch 爲 PatternCharacter 表示的字符。
- 令 A 爲單元素 CharSet,包含 ch。
- 調用 CharacterSetMatcher(A, false),返回 Matcher。
產生式 Atom :: . 執行方式如下
- 令 A 爲 除去 LineTerminator 外的所有字符。
- 調用 CharacterSetMatcher(A, false),返回 Matcher。
產生式 Atom :: \ AtomEscape 通過執行 AtomEscape 返回 Matcher。
產生式 Atom :: CharacterClass 執行方式如下:
- 執行 CharacterClass 得到 CharSet A 和 Boolean invert。
- 調用 CharacterSetMatcher(A, false),返回 Matcher。
產生式 Atom :: ( Disjunction ) 執行方式如下:
- 執行 Disjunction 得到 Matcher。
- 令 parenIndex 爲 在整個正則表達式中從產生式展開初始化左括號時,當前展開左捕獲括號的索引。parenIndex 爲在產生式的 Atom 被展開之前,Atom :: ( Disjunction ) 產生式被展開的次數,加上 Atom :: ( Disjunction ) 閉合 這個 Atom 的次數。
- 返回一個內部閉包
Matcher,擁有2個參數:一個
State x 和
Continuation c,執行方式如下:
- 創建內容閉包 Continuation d,參數爲State y,並按如下方式執行:
- 執行 m(x, d),返回其結果。
產生式 Atom :: ( ? : Disjunction ) 通過執行 Disjunction 得到並返回一個 Matcher。
抽象操作 CharacterSetMatcher,擁有2個參數:一個 CharSet A 和 Boolean invert 標誌,按如下方式執行:
- 返回一個內部閉包
Matcher,擁有2個參數:一個
State x 和
Continuation c,執行方式如下:
- 令 e 爲 x 的 endIndex。
- 若 e == InputLength,返回 failure。
- 令 ch 爲字符Input[e]。
- 令 cc 爲 Canonicalize(ch) 的結果。
- 若 invert 爲false,如果 A 中不存在 a 使得 Canonicalize(a) == cc,返回failure。
- 若 invert 爲true,如果 A 中存在 a 使得 Canonicalize(a) == cc,返回failure。
- 令 cap 爲 x 的內部 captures 數組。
- 令 y 爲 State (e + 1, cap)。
- 調用 c(y),返回結果。
抽象操作 Canonicalize,擁有一個字符參數 ch,按如下方式執行:
- 若 IgnoreCase 爲 false,返回 ch。
- 令 u 爲 ch 轉換爲大寫後的結果,彷彿通過調用標準內置方法 String.prototype.toUpperCase。
- 若 u 不含單個字符,返回 ch。
- 令 cu 爲 u 的字符。
- 若 ch 的單位代碼值 >= 128 且 cu 的單位代碼值 <= 128,返回ch。
- 返回 cu。
例如,
/(?=(a+))/.exec("baaabac")
會匹配第一個b後的空白字符串,得到:
["", "aaa"]
爲了說明預查不會回溯,
/(?=(a+))a*b\1/.exec("baaabac")
得到:
["aba", "a"]
而不是:
["aaaba", "a"]
例如,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
搜索 a,其後有 n 個 a,一個 b, n 個 a(\2 指定)和一個 c。第二個 \2 位於負向預查模式的外部,因此它匹配 undefined,且總是成功的。整個表達式返回一個數組:
["baaabaac", "ba", undefined, "abaac"]
在大小寫不敏感的匹配中,所有字符都在它們參與比較之前隱式轉換成大寫的。然而,如果把一個字符轉換成大寫會產生多個字符(例如 "ß"(\u00DF) 轉換到 "SS"),那麼字符將保持不變。如果一個字符是非 ASCII 字符,但卻會因大小寫轉換而變成 ASCII 字符,那麼在匹配中它也會保持不變。這個規定阻止了一些如 \u0131 和 \u017F 之類的 Unicode 字符 被 /[a-z]/i 這樣的正則表達式匹配,這樣的正則表達式被故意設計成只匹配 ASCII 字符。此外,倘若從 Unicode 到 ASCII 的轉換被允許,將會造成 /[^\W]/i 可以匹配 a、b、…、h,但無法匹配 i 或 s。
轉義原子(AtomEscape)
產生式 AtomEscape :: DecimalEscape 執行方式如下:
- 執行 DecimalEscape 得到 EscapeValue E。
- 如果 E 爲一個字符,
- 令 ch 爲 E 的字符。
- 令 A 爲包含 ch 字符的單元素字符集 CharSet。
- 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。
- E 必須是一個數。令 n 爲該數。
- 如果 n = 0 或 n > NcapturingParens,拋出 SyntaxError 異常。
- 返回一個內部閉包
Matcher,擁有2個參數:一個
State x 和
Continuation c,執行方式如下:
- 令 cap 爲 x 的 captures 內部數組。
- 令 s 爲 cap[n]。
- 如果 s 爲 undefined,調用 c(x),返回結果
- 令 e 爲 x 的 endIndex。
- 令 len 爲 s 的 length。
- 令 f 爲 e + len。
- 如果 f > InputLength,返回 failure。
- 如果存在位於 0(包括)到 len(不包括)的整數 i 使得 Canonicalize(s[i]) 等於 Canonicalize(Input[e + i]),那麼返回failure。
- 令 y 爲State (f, cap)。
- 調用 c(y),返回結果。
產生式 AtomEscape :: CharacterEscap 執行方式如下:
- 執行 CharacterEscap 得到一個 ch 字符。
- 令 A 爲包含 ch 字符的單元素字符集 CharSet。
- 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。
產生式 AtomEscape :: CharacterClassEscape 執行方式如下:
- 執行 CharacterClassEscape 得到一個CharSet A。
- 調用 CharacterSetMatcher(A, false) 返回 Matcher 結果。
轉義字符(CharacterEscap)
產生式 CharacterEscap :: ControlEscape 執行返回一個根據 表23 定義的字符:
ControlEscape | 單位代碼 | 名稱 | 記號 |
---|---|---|---|
t | \u0009 | 水平製表符 | <HT> |
n | \u000A | 換行符 | <LF> |
v | \u000B | 垂直製表符 | <VT> |
f | \u000C | 換頁符 | <FF> |
r | \u000D | 回車符 | <CR> |
產生式 CharacterEscap :: c ControlLetter 執行過程如下:
- 令 ch 爲通過 ControlLetter 表示的字符
- 令 i 爲 ch 的單位代碼值
- 令 j 爲 i/32 的餘數
- 返回 j
產生式 CharacterEscap :: HexEscapeSequence 執行 HexEscapeSequence 的字符值,返回其字符結果。
產生式 CharacterEscap :: UnicodeEscapeSequence 執行 UnicodeEscapeSequence 的字符值,返回其字符結果。
產生式 CharacterEscap :: IdentityEscape 執行返回由 IdentityEscape 表示的字符。
轉義十進制(DecimalEscape)
產生式 DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] 按如下方式執行:
- 令 i 爲 DecimalIntegerLiteral 的字符值
- 如果 i 爲 0,返回包含一個 <NUL> 字符(Unicode 值爲 0000)的 EscapeValue
- 返回包含整數 i 的 EscapeValue
DecimalIntegerLiteral 的數學值在 7.8.3 節定義。
轉義字符類(CharacterClassEscape)
產生式 CharacterClassEscape :: d 執行返回包含0到9之間的十元素字符集。
產生式 CharacterClassEscape :: D 執行返回不包括 CharacterClassEscape :: d 的字符集。
產生式 CharacterClassEscape :: s 執行返回包含 WhiteSpace 或 LineTerminator 產生式右部分字符的字符集。
產生式 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 獲得並返回這個 CharSet 和 Boolean false。
產生式 CharacterClass :: [ ^ ClassRanges ] 通過執行 ClassRanges 獲得並返回這個 CharSet 和 Boolean true。
字符範圍集(ClassRanges)
產生式 ClassRanges :: [empty] 執行返回一個空的 CharSet。
產生式 ClassRanges :: NonemptyClassRanges 通過執行 NonemptyClassRanges 獲得並返回這個 CharSet。
非空字符範圍集(NonemptyClassRanges)
產生式 NonemptyClassRanges :: ClassAtom 通過執行 ClassAtom 獲得一個 CharSet 並返回這個CharSet。
產生式 NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash 按如下方式執行:
- 執行 ClassAtom 得到一個 CharSet A。
- 執行 NonemptyClassRangesNoDash 得到一個 CharSet B。
- 返回 A 與 B 的並集。
產生式 NonemptyClassRanges :: ClassAtom - ClassAtom ClassRanges 按如下方式執行:
- 執行第一個 ClassAtom 得到一個 CharSet A。
- 執行第二個 ClassAtom 得到一個 CharSet B。
- 執行 ClassRanges 得到一個CharSet C。
- 調用 CharacterRange(A, B),令D爲其結果 CharSet。
- 返回 D 與 C 的並集。
抽象操作 CharacterRange,擁有2個 CharSet 參數 A 和 B,執行方式如下:
- 如果 A 或 B 爲空,拋出 SyntaxError 異常。
- 令 a 爲 CharSet A 的一個字符。
- 令 b 爲 CharSet B 的一個字符。
- 令 i 爲 a 的單位代碼值。
- 令 j 爲 b 的單位代碼值。
- 如果 i > j,拋出 SyntaxError 異常。
- 返回位於在 i 到 j(包括邊界)之間的所有字符的字符集。
無連接符非空字符範圍集(NonemptyClassRangesNoDash)
產生式 NonemptyClassRangesNoDash :: ClassAtom 執行一個 ClassAtom 獲取結果 CharSet 並返回。
產生式 NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash 的結果根據以下步驟:
- 執行 ClassAtomNoDash 得到一個 CharSet A。
- 執行 NonemptyClassRangesNoDash 得到一個 CharSet B。
- 返回 CharSet A 和 CharSet B 的並集。
產生式 NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassRanges 按下面的步驟執行:
- 執行 ClassAtomNoDash 得到一個 CharSet A。
- 執行 ClassAtom 得到一個 CharSet B。
- 執行 ClassRanges 得到一個 CharSet C
- 令 D 爲調用方法 CharacterRange(A, B) 返回的 CharSet。
- 返回 CharSet D 和 CharSet C 的並集。
後面的情況中 ClassRanges 包含從第一個 ClassAtom 與第二個 ClassAtom 之間的所有字符。
如果其中一個 ClassAtom 不描述單一字符(例如\w)或如果第一個 ClassAtom 的單位代碼值大於第二個 ClassAtom,則產生一個錯誤。
字符類原子(ClassAtom)
產生式 ClassAtom :: - 執行返回包含單個字符 - 的字符集。
產生式 ClassAtom :: ClassAtomNoDash 通過執行 ClassAtomNoDash 獲得並返回這個 CharSet。
非連接符字符類原子(ClassAtomNoDash)
產生式 ClassAtomNoDash :: SourceCharacter 不包括 \、]、- 執行返回包含由 SourceCharacter 表示的字符的單元素字符集。
產生式 ClassAtomNoDash :: \ ClassEscape 通過執行 ClassEscape 得到並返回這個 CharSet。
字符類可用轉義(ClassEscape)
產生式 ClassEscape :: DecimalEscape 按如下方式執行:
- 執行 DecimalEscape 得到 EscapeValue E
- 如果 E 不是一個字符,拋出 SyntaxError 異常。
- 令 ch 爲 E 的字符。
- 返回包含字符 ch 的單元素 CharSet。
產生式 ClassEscape :: b 執行返回包含一個 <BS> 字符(Unicode 值 0008)的字符集。
產生式 ClassEscape :: CharacterEscap 通過執行 CharacterEscap 獲得一個字符 CharSet 並返回包含該字符的單元素字符集 CharSet。
產生式 ClassEscape :: CharacterClassEscape 通過執行 CharacterClassEscape 獲得並返回這個CharSet。
RegExp 構造器作爲函數調用
RegExp(pattern, flags)
如果 pattern 是一個對象 R,其內部屬性 [[Class]] 爲 "RegExp" 且 flags 爲 undefined,返回 R。否則,調用內置RegExp構造器,通過表達式 new RegExp(pattern, flags) 返回由該構造器構造的對象。
RegExp 構造器
當RegExp作爲 new 表達式一部分調用時,它是一個構造器,用來初始化一個新創建的對象。
new RegExp(pattern, flags)
如果 pattern 是一個對象且它的 [[Class]] 內部屬性爲 "RegExp",則令 R 爲 pattern。接着,如果 flags 是 undefined,則令 P 爲構造 R 時使用的 pattern,令 F 爲構造 R 時使用的 flags,否則拋出TypeError異常。對於其它情況,如果 pattern 爲 undefined,則令 P 爲空字符串,否則令 P 爲 ToString(pattern),如果 flags 爲 undefined,則令 F 爲空字符串,否則令 F 爲 ToString(flags)。
如果字符 P 不滿足 Pattern 句法,那麼拋出 SyntaxError 異常。否則,令新構造的對象擁有內部 [[Match]] 屬性,該屬性通過執行(編譯)字符 P 作爲在 15.10.2 節描述的 Pattern。
如果 F 含有除 "g"、"i"、"m" 外的任意字符,或者 F 中包括出現多次的字符,那麼,拋出SyntaxError異常。
如果 SyntaxError 異常未拋出,那麼:
令 S 爲一個字符串,其等價於 P 表示的 Pattern,S 中的字符按如下描述進行轉義。這樣,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"。
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 構造器。
RegExp.prototype.exec(string)
- 令 R 爲該 RegExp 對象。
- 令 S 爲ToString(string)的值。
- 令 length 爲 S 的長度。
- 令 lastIndex 爲以參數 "lastIndex" 調用 R 的內部方法 [[Get]] 的結果。
- 令 i 爲 ToInteger(lastIndex) 的值。
- 令 global 爲以參數 "global" 調用 R 的內部方法 [[Get]] 的結果。
- 若 global 爲 false,則令 i = 0。
- 令 matchSucceeded 爲false。
- 到 matchSucceeded 爲false 前重複以下。
- 令 e 爲 r 的 endIndex 值。
- 若 global 爲true,
- 以參數 "lastIndex"、e 和 true 調用 R 的內部方法 [[Put]]。
- 令 n 爲 r 的捕獲數組的長度。(這跟 15.10.2.1 的 NcapturingParens 是同一個值)
- 令 A 爲如同以表達式 new Array 創建的新數組,其中Array是這個名字的內置構造器。
- 令 matchIndex 爲匹配到的子串在整個字符串 S 中的位置。
- 以參數 "index",屬性描述 {[[Value]]: matchIndex, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法 [[DefineOwnProperty]]。
- 以參數 "input",屬性描述 {{[[Value]]: S, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法[[DefineOwnProperty]]。
- 以參數"length",屬性描述 {[[Value]]: n + 1} 和 true 調用 A 的內部方法[[DefineOwnProperty]]。
- 令 matchedSubstr 爲匹配到的子串(例如:S 中從 i 位置<包含>到 e 位置<不包含>的部分 )。
- 以參數 "0",屬性描述 {{[[Value]]: matchedSubstr, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法[[DefineOwnProperty]]。
- 對每一滿足 I > 0 且 I ≤ n 的整數
i
- 令 captureI 爲第 i 個捕獲數組中的元素。
- 以參數 ToString(i),屬性描述 {[[Value]]: captureI, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 true 調用 A 的內部方法 [[DefineOwnProperty]]。
- 返回 A。
RegExp.prototype.test(string)
採用如下步驟:
- 令 match 爲在這個 RegExp 對象上使用 string 作爲參數執行 RegExp.prototype.exec 的結果。
- 如果 match 不爲 null,返回 true;否則返回 false。
RegExp.prototype.toString()
返回一個 String,由 "/"、RegExp 對象的 source 屬性值、"/" 與 "g"(如果 global 屬性爲 true),"i"(如果 IgnoreCase 爲true),"m"(如果 multiline 爲true)通過連接組成。
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 }。
Error對象
Error 對象的實例在運行時遇到錯誤的情況下會被當做異常拋出。Error 對象也可以作爲用戶自定義異常類的基對象。
Error構造器作爲函數調用
當 Error 被作爲函數而不是構造器調用時,它創建並初始化一個新的 Error 對象。這樣函數調用 Error(…) 與同樣參數的對象創建表達式 new Error(…) 是等效的。
Error (message)
新構造的對象內部屬性 [[Prototype]] 會被設爲原本的 Error 原型對象,也就是 Error.prototype 的初始值。(15.11.3.1)
新構造的對象內部屬性 [[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)。
此屬性有以下特性: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
Error 原型對象的屬性
Error原型對象本身是一個Error對象(其[[Class]]爲"Error")。
Error原型對象的內部屬性 [[Prototype]] 爲標準內置的 Object 原型對象。
Error.prototype.constructor
Error.prototype.constructor 初始值爲內置的 Error 構造器。
Error.prototype.name
Error.prototype.name 初始值爲 "Error"。
Error.prototype.message
Error.prototype.message 初始值爲空字符串。
Error.prototype.toString ( )
執行以下步驟
- 令 O 爲 this 值
- 如果 Type(O) 不是對象,拋出一個TypeError異常。
- 令 name 爲以"name"爲參數調用 O 的 [[Get]] 內置方法的結果。
- 如果 name 爲undefined, 令 name 爲 "Error";否則令 name 爲ToString(name)。
- 令 msg 爲以"message"爲參數調用 O 的 [[Get]] 內置方法的結果。
- 如果 msg 爲 undefined,令 msg 爲空字符串;否則令 msg 爲ToString(msg)。
- 如果 name 與 msg 都是空字符串,返回"Error"。
- 如果 name 爲空字符串,返回 msg。
- 如果 msg 爲空字符串,返回 name。
- 返回拼接 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 中具體的對象名替換。
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 對象是一個單一的對象,它包含兩個函數,parse 和 stringify,是用於解析和構造 JSON 文本的。JSON 數據的交換格式在 RFC4627 裏進行了描述。本規範裏面的 JSON 交換格式會使用 RFC4627 裏所描述的,以下兩點除外:
- ECMAScript JSON 文法中的頂級 JSONText 產生式是由 JSONValue 構成,而不是 RFC4627 中限制成的 JSONObject 或者 JSONArray。
- 確認 JSON.parse 和 JSON.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 :: <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 詞法定義的 Token,JSON 句法定義了一個合法的 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 字符串、數字、布爾值以及 null。JSON 使用受限更多的空白字符集合,並且允許 Unicode 碼點 U+2028 和 U+2029直 接出現在 JSONString 直接量當中而無需使用轉義序列。解析流程與 11.1.4 和 11.1.5 一樣,但是由 JSON 語法限定。
可選參數 reviver 是一個接受兩個參數的函數(key 和 value)。它可以過濾和轉換結果。它在每個 key/value 對產生時被調用,它的返回值可以用於替代原本的值。如果它原樣返回接收到的,那麼結構不會被改變。如果它返回 undefined,那麼屬性會被從結果中刪除。
- 令 JText 爲 ToString(text)。
- 以 15.12.1 所述語法解析 JText。如果 JText 不能以 JSON 語法解析成 JSONText,則拋出 SyntaxError 異常。
- 令 unfiltered 爲按 ECMAScript 程序(但是用 JSONString 替換 StringLiteral)解析和執行 JText 的結果。注因 JText 符合JSON語法,這個結果要麼是原始值類型要麼是 inlineArrayLiteral 或者 ObjectLiteral 所定義的對象。
- 若
IsCallable(reviver) 爲 true 則
- 令 root 爲由表達式 new Object() 創建的新對象,其中 Object 是以 Object 爲名的標準內置的構造器。
- 以空字符串和屬性描述 {[[Value]]: unfiltered, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 爲參數調用 root 的 [[DefineOwnProperty]] 內置方法。
- 返回傳入 root 和空字符串爲參數調用抽象操作 Walk 的結果,抽象操作 Walk 如下文所定義。
- 否則,返回 unfiltered。
抽象操作 Walk 是一個遞歸的抽象操作,它接受兩個參數:一個 holder 對象和一個表示該對象的屬性名的 String name 。Walk 使用最開始被傳入 parse 函數的 reviver 的值。
- 令 val 爲以參數 name 調用 holder 的 [[Get]] 內部方法的結果。
- 若 val 爲對象,則
- 若 val 的
[[Class]] 內部屬性爲 "Array"
- 設 I 爲 0。
- 令 len 爲以參數 "length" 調用 val 的 [[Get]] 內部方法的結果。
- 當 I < len 時重複
- 令 newElement 爲調用抽象操作 Walk 的結果,傳入 val 和 ToString(I) 爲參數。
- 若 newElement 爲 undefined,則
- 以 ToString(I) 和 false 做參數,調用 val 的內部方法 [[Delete]]。
- 否則,以ToString(I),屬性描述 {[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 以及 false 做參數調用 val 的內部方法[[DefineOwnProperty]]。
- 對 I 加 1。
- 否則
- 令 keys 爲包含 val 所有的具有 [[Enumerable]] 特徵的屬性名 String 值的內部類型 List。字符串的順序應當與內置函數 Object.keys 一致。
- 對每個 keys 中的字符串 P 做以下操作
- 令 newElement 爲調用抽象操作 Walk 的結果,傳入 val 和 P 爲參數。
- 若 newElement 爲 undefined,則
- 以 P 和 false 做參數,調用 val 的內部方法 [[Delete]]。
- 否則,以 P,屬性描述{[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 做參數調用調用 val 的內部方法 [[DefineOwnProperty]]。
- 若 val 的
[[Class]] 內部屬性爲 "Array"
- 返回傳入 holder 作爲 this 值以及以 name 和 val 構成的參數列表調用 reviver 的[[Call]]內部屬性的結果。
實現不允許更改 JSON.parse 的實現以擴展 JSON 語法。如果一個實現想要支持更改或者擴展過的 JSON 交換格式它必須以定義一個不同的 parse 函數的方式做這件事。
stringify ( value [ , replacer [ , space ] ] )
stringify 函數返回一個 JSON 格式的字符串,用以表示一個ECMAScript值。它可以接受三個參數。第一個參數是必選的。value 參數是一個ECMAScript 值,它通常是對象或者數組,儘管它也可以是 String、Boolean、Number 或者是 null。可選的 replacer 參數要麼是個可以修改對象和數組字符串化的方式的函數,要麼是個扮演選擇對象字符串化的屬性的白名單這樣的角色的 String 和 Number 組成的數組。可選的 space 參數是一個 String 或者 Number,可以允許結果中插入空白符以改善人類可讀性。
以下爲字符串化一對象的步驟:
- 令 stack 爲空 List。
- 令 indent 爲空 String。
- 令 PropertyList 和 ReplacerFunction 爲 undefined。
- 若
Type(replacer) 爲 Object,則
- 若
IsCallable(replacer) 爲 true,則
- 令 ReplacerFunction 爲 replacer
- 否則若 replacer 的內部屬性
[[Class]] 爲 "Array",則
- 令 PropertyList 爲一空內部類型 List
- 對於所有名是數組下標的 replacer 的屬性 v。以數組下標遞增順序枚舉屬性
- 若
IsCallable(replacer) 爲 true,則
- 若 Type(space) 爲 Object 則,
- 若 Type(space) 爲 Number。
- 否則若
Type(space) 爲String
- 若 space 中字符個數爲 10 或者更小,設 gap 爲 space,否則設 gap 爲包含前 10 個 space 中字符的字符串。
- 否則設 gap 爲空 String。
- 令 wrapper 爲一個如同以表達式 new Object() 創建的新對象,其中 Object 是這個名字的標準內置構造器。
- 以參數空 String,屬性描述{[[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} 和 false 調用 wrapper 的[[DefineOwnProperty]]內部方法。
- 返回以空 String 和 wrapper 調用抽象方法 Str 的結果。
抽象操作 Str(key, holder) 可以訪問調用它的
stringify 方法中的 ReplacerFunction。其算法如下:
- 令 value 爲以 key 爲參數調用 holder 的內部方法[[Get]]。
- 若
Type(value) 爲 Object,則
- 令 toJSON 爲以 "toJSON" 爲參數調用 value 的內部方法 [[Get]]。
- 若
IsCallable(toJSON) 爲 true
- 令 value 爲以調用 toJSON 的內部方法 [[Call]] 的結果,傳入 value 爲this值以及由 key 構成的參數列表。
- 若 ReplacerFunction 不爲 undefined,則
- 令 value 爲以調用 ReplacerFunction 的內部方法 [[Call]] 的結果,傳入 holder 爲 this 值以及由 key 和 value 構成的參數列表。
- 若 Type(value) 爲 Object 則,
- 若 value 爲 null 則 返回 "null"。
- 若 value 爲 true 則 返回 "true"。
- 若 value 爲 false 則 返回 "false"。
- 若 Type(value) 爲 String,則返回以value調用Quote抽象操作的結果。
- 若
Type(value) 爲 Number
- 若 value 是有限的數字則 返回 ToString(value)。
- 否則,返回 "null"。
- 若 Type(value) 爲 Object 且 IsCallable(value) 爲 false
- 返回 undefined。
抽象操作 Quote(value) 將一個
String 值封裝在雙引號中,並且對其中的字符轉義。
- 令 product 爲雙引號字符。
- 對 value 中的每一個字符 C
- 若 C 爲雙引號字符或者反斜槓字符
- 令 product 爲 product 和反斜槓連接的結果。
- 令 product 爲 product 與 C 的連接。
- 否則若 C 爲退格符、換頁符、換行符、回車符或製表符
- 令 product 爲 product 與反斜槓字符的連接。
- 令 abbrev 爲如下表所示 C 對應的字符:
退格符 "b"
換頁符 "f"
換行符 "n"
回車符 "r"
製表符 "t" - 令 product 爲 product 與 abbrev 的連接。
- 否則若 C 爲代碼值小於空白字符 的控制字符。
- 令 product 爲 product 與反斜槓字符的連接。
- 令 product 爲 product 與 "u" 的連接。
- 令 hex 爲轉換 C 代碼值按十六進制轉換到四位字符串的結果。
- 令 product 爲 product 與 hex 的連接。
- 否則
- 令 product 爲 product 與 C 的連接。
- 若 C 爲雙引號字符或者反斜槓字符
- 令 product 爲 product 與雙引號字符的連接。
- 返回 product。
抽象操作 JO(value) 序列化一個對象,它可以訪問調用它的方法中的
stack、indent、gap、PropertyList、ReplacerFunction 以及
space 。
- 若 stack 包含 value,則拋出一個TypeError,因爲對象結構中存在循環。
- 將 value 添加到 stack。
- 令 stepback 爲 indent。
- 令 indent 爲 indent 與 gap 的連接。
- 若 PropertyList 不爲 undefined 則
- 令 K 爲 PropertyList
- 否則
- 令 K 爲 value 上所有 [[Enumerable]] 特性爲 true 的自身屬性名構成的內部字符串列表。其順序應該和 Object.keys 標準內置函數得到的順序相同。
- 令 partial 爲空 List。
- 對於 K 的每一個元素 P
- 令 strP 爲以 P 和 value 爲參數調用抽象操作 Str 的結果。
- 若 strP 沒有被定義
- 令 member 爲以 P 爲參數調用抽象操作P的結果。
- 令 member 爲 member 與冒號字符的連接。
- 若 gap 不爲空 String。
- 令 member 爲 member 與空格字符 的連接。
- 令 member 爲 member 與 strP 的連接。
- 將 member 添加到 partial。
- 若 partial 爲 empty,則
- 令 final 爲 "{}"。
- 否則
- 若 gap 爲空 String
- 令 properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用逗號分隔。第一個字符串之前和最後一個字符串之後沒有逗號。
- 令 final 爲連接 "{"、properties、和 "}" 的結果。
- 否則 gap 不是空 String
- 令 separator 爲連接 逗號字符,換行字符以及 indent 而成的字符串。
- 令 properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用 separator 分隔。第一個字符串之前和最後一個字符串之後沒有 separator。
- 令 final 爲連接 "{"、換行符、indent、properties、換行符、stepback 和 "}" 的結果。
- 若 gap 爲空 String
- 移除 stack 中的最後一個元素。
- 令 indent 爲 stepback。
- 返回 final。
抽象操作 JA(value) 序列化一個數組。它可以訪問調用它的
stringify 方法中的 stack、indent、gap、PropertyList、ReplacerFunction 以及
space 。數組的表示中僅包擴零到
array.length - 1的區間。命名的屬性將會被從字符串化操作中排除。數組字符串化成開頭的左方括號,逗號分隔的元素,以及結束的右方括號。
- 若 stack 包含 value,則拋出一個TypeError,因爲對象結構中存在循環。
- 將 value 添加到 stack。
- 令 stepback 爲 indent。
- 令 indent 爲 indent 與 gap 的連接。
- 令 partial 爲空 List。
- 令 len 爲以 "length" 爲參數調用 value 的內部方法 [[Get]]。
- 令 index 爲 0。
- 當 index < len 時重複以下
- 若 partial 爲空,則
- 令 final 爲 "[]"。
- 否則
- 若 gap 爲空 String。
- 令 properties 爲爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用逗號分隔。第一個字符串之前和最後一個字符串之後沒有逗號。
- 令 final 爲連接 "["、properties 和 "]" 的結果。
- 否則
- 令 separator 爲逗號字符,換行字符以及 indent 而成的字符串。
- 令 properties 爲一個連接所有 partial 中的字符串而成的字符串,鍵值對之間用 separator 分隔。第一個字符串之前和最後一個字符串之後沒有 separator。
- 令 final 爲連接 "["、換行符、indent、properties、換行符、stepback 和 "]" 的結果。
- 若 gap 爲空 String。
- 移除 stack 中的最後一個元素。
- 令 indent 爲 stepback。
- 返回 final。
a = []; a[0] = a; my_text = JSON.stringify(a); // This must throw an TypeError.
- null 值在 JSON 文本中表示爲 String null。
- undefined 值不出現。
- true 值在 JSON 文本中表示爲 String true。
- false 值在 JSON 文本中表示爲 String false。