數(shù)組對(duì)象會(huì)給予一些種類的屬性名特殊待遇。對(duì)一個(gè)屬性名 P(字符串形式),當(dāng)且僅當(dāng) ToString(ToUint32(P)) 等于 P 并且 ToUint32(P) 不等于 232?1 時(shí),它是個(gè) 數(shù)組索引 。一個(gè)屬性名是數(shù)組索引的屬性還叫做 元素 。所有數(shù)組對(duì)象都有一個(gè) length 屬性,其值始終是一個(gè)小于 232 的非負(fù)整數(shù)。length 屬性值在數(shù)值上比任何名為數(shù)組索引的屬性的名稱還要大;每當(dāng)創(chuàng)建或更改一個(gè)數(shù)組對(duì)象的屬性,要調(diào)整其他的屬性以保持上面那個(gè)條件不變的需要。具體來說,每當(dāng)添加一個(gè)名為數(shù)組索引的屬性時(shí),如果需要就更改 length 屬性為在數(shù)值上比這個(gè)數(shù)組索引大 1 的值;每當(dāng)更改 length 屬性,所有屬性名是數(shù)組索引并且其值不小于新 length 的屬性會(huì)被自動(dòng)刪除。這個(gè)限制只應(yīng)用于數(shù)組對(duì)象的自身屬性,并且從原型中繼承的 length 或數(shù)組索引不影響這個(gè)限制。
對(duì)一個(gè)對(duì)象 O,如果以下算法返回 true,那么就叫這個(gè)對(duì)象為 稀疏 的:
- 令 len 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 對(duì)每個(gè)范圍在 0≤i<ToUint32(len) 的整數(shù) i令 elem 為以 ToString(i) 作為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果。如果 elem 是 undefined, 返回 true.
- 返回 false.
作為函數(shù)調(diào)用 Array 構(gòu)造器
當(dāng)將 Array 作為函數(shù)來調(diào)用,而不是作為構(gòu)造器,它會(huì)創(chuàng)建并初始化一個(gè)新數(shù)組對(duì)象。所以函數(shù)調(diào)用 Array(…) 與用相同參數(shù)的 new Array(…) 表達(dá)式創(chuàng)建的對(duì)象相同。
Array ( [ item1 [ , item2 [ , … ] ] ] )
當(dāng)調(diào)用 Array 函數(shù),采用如下步驟:
- 創(chuàng)建并返回一個(gè)新函數(shù)對(duì)象,它仿佛是用相同參數(shù)給標(biāo)準(zhǔn)內(nèi)置構(gòu)造器 Array 用一個(gè) new 表達(dá)式創(chuàng)建的 (15.4.2)。
Array 構(gòu)造器
當(dāng) Array 作為 new 表達(dá)式的一部分被調(diào)用時(shí),它是一個(gè)構(gòu)造器:它初始化新創(chuàng)建的對(duì)象。
new Array ( [ item0 [ , item1 [ , … ] ] ] )
當(dāng)且僅當(dāng)以無參數(shù)或至少兩個(gè)參數(shù)調(diào)用 Array 構(gòu)造器時(shí),適用這里的描述。
新構(gòu)造對(duì)象的 [[Prototype]] 內(nèi)部屬性要設(shè)定為原始的數(shù)組原型對(duì)象,他是 Array.prototype(15.4.3.1) 的初始值。
新構(gòu)造對(duì)象的 [[Class]] 內(nèi)部屬性要設(shè)定為 "Array"。
新構(gòu)造對(duì)象的 [[Extensible]] 內(nèi)部屬性要設(shè)定為 true。
新構(gòu)造對(duì)象的 length 屬性要設(shè)定為參數(shù)的個(gè)數(shù)。
新構(gòu)造對(duì)象的 0 屬性要設(shè)定為 item0( 如果提供了 ); 新構(gòu)造對(duì)象的 1 屬性要設(shè)定為 item1( 如果提供了 ); 更多的參數(shù)可應(yīng)用普遍規(guī)律,新構(gòu)造對(duì)象的 k 屬性要設(shè)定為第 k 個(gè)參數(shù),這里的 k 是從 0 開始的。所有這些屬性都有特性 {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}。
new Array (len)
新構(gòu)造對(duì)象的 [[Prototype]] 內(nèi)部屬性要設(shè)定為原始的數(shù)組原型對(duì)象,他是 Array.prototype(15.4.3.1) 的初始值。新構(gòu)造對(duì)象的 [[Class]] 內(nèi)部屬性要設(shè)定為 "Array"。新構(gòu)造對(duì)象的 [[Extensible]] 內(nèi)部屬性要設(shè)定為 true。
如果參數(shù) len 是個(gè)數(shù)字值并且 ToUint32(len) 等于 len,則新構(gòu)造對(duì)象的 length 屬性要設(shè)定為 ToUint32(len)。如果參數(shù) len 是個(gè)數(shù)字值并且 ToUint32(len) 不等于 len,則拋出一個(gè) RangeError 異常。
如果參數(shù) len 不是數(shù)字值,則新構(gòu)造對(duì)象的 length 屬性要設(shè)定為 0,并且新構(gòu)造對(duì)象的 0 屬性要設(shè)定為 len,設(shè)定它的特性為 {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}。
Array 構(gòu)造器的屬性
Array 構(gòu)造器的 [[Prototype]] 內(nèi)部屬性值是函數(shù)原型對(duì)象 (15.3.4)。
Array 構(gòu)造器除了有一些內(nèi)部屬性和 length 屬性(其值是 1)之外,還有如下屬性:
Array.prototype
Array.prototype 的初始值是數(shù)組原型對(duì)象 (15.4.4)。
此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}。
Array.isArray ( arg )
isArray 函數(shù)需要一個(gè)參數(shù) arg,如果參數(shù)是個(gè)對(duì)象并且 class 內(nèi)部屬性是 "Array", 返回布爾值 true;否則它返回 false。采用如下步驟:
- 如果 Type(arg) 不是 Object, 返回 false。
- 如果 arg 的 [[Class]] 內(nèi)部屬性值是 "Array", 則返回 true。
- 返回 false.
數(shù)組原型對(duì)象的屬性
數(shù)組原型對(duì)象的 [[Prototype]] 內(nèi)部屬性值是標(biāo)準(zhǔn)內(nèi)置 Object 原型對(duì)象 (15.2.4)。
數(shù)組原型對(duì)象自身是個(gè)數(shù)組;它的 [[Class]] 是 "Array",它擁有一個(gè) length 屬性(初始值是 +0)和 15.4.5.1 描述的特殊的 [[DefineOwnProperty]] 內(nèi)部方法。
在以下的對(duì)數(shù)組原型對(duì)象的屬性函數(shù)的描述中,短語(yǔ)“this 對(duì)象”指的是調(diào)用這個(gè)函數(shù)時(shí)的 this 值對(duì)象。允許 this 是 [[Class]] 內(nèi)部屬性值不是 "Array" 的對(duì)象。
數(shù)組原型對(duì)象不包含它自身的 valueOf 屬性;然而,它從標(biāo)準(zhǔn)內(nèi)置 Object 原型對(duì)象繼承 valueOf 屬性。
Array.prototype.constructor
Array.prototype.constructor 的初始值是標(biāo)準(zhǔn)內(nèi)置 Array 構(gòu)造器。
Array.prototype.toString ( )
當(dāng)調(diào)用 toString 方法,采用如下步驟:
- 令 array 為用 this 值調(diào)用 ToObject 的結(jié)果。
- 令 func 為以 "join" 作為參數(shù)調(diào)用 array 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 如果 IsCallable(func) 是 false, 則令 func 為標(biāo)準(zhǔn)內(nèi)置方法 Object.prototype.toString (15.2.4.2)。
- 提供 array 作為 this 值并以空參數(shù)列表調(diào)用 func 的 [[Call]] 內(nèi)部方法,返回結(jié)果。
toString 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) toString 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.toLocaleString ( )
先用數(shù)組元素的 toLocaleString 方法,將他們轉(zhuǎn)換成字符串。然后將這些字符串串聯(lián),用一個(gè)分隔符分割,這里的分隔符字符串是與特定語(yǔ)言環(huán)境相關(guān),由實(shí)現(xiàn)定義的方式得到的。調(diào)用這個(gè)函數(shù)的結(jié)果除了與特定語(yǔ)言環(huán)境關(guān)聯(lián)之外,與 toString 的結(jié)果類似。
結(jié)果是按照一下方式計(jì)算的:
- 令 array 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果。
- 令 arrayLen 為以 "length" 作為參數(shù)調(diào)用 array 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 令 len 為 ToUint32(arrayLen)。
- 令 separator 為宿主環(huán)境的當(dāng)前語(yǔ)言環(huán)境對(duì)應(yīng)的列表分隔符字符串(這是實(shí)現(xiàn)定義的方式得到的)。
- 如果 len 是零 , 返回空字符串。
- 令 firstElement 為以 "0" 作為參數(shù)調(diào)用 array 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 如果 firstElement 是 undefined 或 null, 則令 R 為空字符串。
- 否則令 elementObj 為 ToObject(firstElement).令 func 為以 "toLocaleString" 作為參數(shù)調(diào)用 elementObj 的 [[Get]] 內(nèi)部方法的結(jié)果。如果 IsCallable(func) 是 false, 拋出一個(gè) TypeError 異常。令 R 為提供 elementObj 作為 this 值并以空參數(shù)列表調(diào)用 func 的 [[Call]] 內(nèi)部方法的結(jié)果。
- 令 k 為 1。
- 只要 k < len 就重復(fù)令 S 為串聯(lián) R 和 separator 產(chǎn)生的字符串。令 nextElement 為以 ToString(k) 作為參數(shù)調(diào)用 array 的 [[Get]] 內(nèi)部方法的結(jié)果。如果 nextElement 是 undefined 或 null, 則令 R 為空字符串。否則令 elementObj 為 ToObject(nextElement).令 func 為以 "toLocaleString" 作為參數(shù)調(diào)用 elementObj 的 [[Get]] 內(nèi)部方法的結(jié)果。如果 IsCallable(func) 是 false, 拋出一個(gè) TypeError 異常。令 R 為提供 elementObj 作為 this 值并以空參數(shù)列表調(diào)用 func 的 [[Call]] 內(nèi)部方法的結(jié)果。令 R 為串聯(lián) S 和 R 產(chǎn)生的字符串。k 遞增 1。
- 返回 R
此函數(shù)的第一個(gè)參數(shù)可能會(huì)在本標(biāo)準(zhǔn)的未來版本中用到;建議實(shí)現(xiàn)不要以任何其他用途使用這個(gè)參數(shù)位置。
toLocaleString 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) toLocaleString 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
當(dāng)以零或更多個(gè)參數(shù) item1, item2, 等等,調(diào)用 concat 方法,返回一個(gè)數(shù)組,這個(gè)數(shù)組包含對(duì)象的數(shù)組元素和后面跟著的每個(gè)參數(shù)按照順序組成的數(shù)組元素。
采用如下步驟:
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果。
- 令 A 為仿佛是用表達(dá)式 new Array() 創(chuàng)建的新數(shù)組,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
- 令 n 為 0。
- 令 items 為一個(gè)內(nèi)部列表,他的第一個(gè)元素是 O,其后的元素是傳給這個(gè)函數(shù)調(diào)用的參數(shù)(以從左到右的順序)。
- 只要 items 不是空就重復(fù)刪除 items 的第一個(gè)元素,并令 E 為這個(gè)元素值。如果 E 的 [[Class]] 內(nèi)部屬性是 "Array", 則令 k 為 0。令 len 為以 "length" 為參數(shù)調(diào)用 E 的 [[Get]] 內(nèi)部方法的結(jié)果。只要 k < len 就重復(fù)令 P 為 ToString(k).令 exists 為以 P 作為參數(shù)調(diào)用 E 的 [[HasProperty]] 內(nèi)部方法的結(jié)果。如果 exists 是 true, 則令 subElement 為以 P 作為參數(shù)調(diào)用 E 的 [[Get]] 內(nèi)部方法的結(jié)果。以 ToString(n), 屬性描述符 {[[Value]]: subElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法。n 遞增 1.k 遞增 1.否則 , E 不是數(shù)組以 ToString(n), 屬性描述符 {[[Value]]: E, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]]</nowiki> 內(nèi)部方法。n 遞增 1.
- 返回 A.
concat 方法的 length 屬性是 1。
concat 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) concat 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.join (separator)
數(shù)組元素先被轉(zhuǎn)換為字符串,再將這些字符串用 separator 分割連接在一起。如果沒提供分隔符,將一個(gè)逗號(hào)用作分隔符。
join 方法需要一個(gè)參數(shù) separator, 執(zhí)行以下步驟 :
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 如果 separator 是 undefined, 令 separator 為單字符字符串 ",".
- 令 sep 為 ToString(separator).
- 如果 len 是零 , 返回空字符串 .
- 令 element0 為以 "0" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 如果 element0 是 undefined 或 null, 令 R 為空字符串 ; 否則 , 令 R 為 ToString(element0).
- 令 k 為 1.
- 只要 k < len 就重復(fù)令 S 為串聯(lián) R 和 sep 產(chǎn)生的字符串值 .令 element 為以 ToString(k) 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .如果 element 是 undefined 或 null, 令 next 為空字符串 ; 否則 , 令 next 為 ToString(element).令 R 為串聯(lián) S 和 next 產(chǎn)生的字符串值 .k 遞增 1.
- 返回 R.
join 方法的 length 屬性是 1。
join 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) join 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.pop ( )
刪除并返回?cái)?shù)組的最后一個(gè)元素。
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 如果 len 是零 ,以 "length", 0, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .返回 undefined.
- 否則 , len > 0令 indx 為 ToString(len–1).令 element 為 以 indx 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 indx 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .以 "length", indx, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .返回 element.
pop 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) pop 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
將參數(shù)以他們出現(xiàn)的順序追加到數(shù)組末尾。數(shù)組的新 length 屬性值會(huì)作為調(diào)用的結(jié)果返回。
當(dāng)以零或更多個(gè)參數(shù) item1,item2, 等等,調(diào)用 push 方法,采用以下步驟:
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 n 為 ToUint32(lenVal).
- 令 items 為一個(gè)內(nèi)部列表,它的元素是調(diào)用這個(gè)函數(shù)時(shí)傳入的參數(shù)(從左到右的順序).
- 只要 items 不是空就重復(fù)刪除 items 的第一個(gè)元素,并令 E 為這個(gè)元素的值 .以 ToString(n), E, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .n 遞增 1.
- 以 "length", n, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .
- 返回 n.
push 方法的 length 屬性是 1。
push 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) push 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.reverse ( )
重新排列數(shù)組元素,以翻轉(zhuǎn)它們的順序。對(duì)象會(huì)被當(dāng)做調(diào)用的結(jié)果返回。
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 令 middle 為 floor(len/2).
- 令 lower 為 0.
- 只要 lower ≠ middle 就重復(fù)令 upper 為 len?lower ?1.令 upperP 為 ToString(upper).令 lowerP 為 ToString(lower).令 lowerValue 為以 lowerP 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 upperValue 為以 upperP 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 lowerExists 為以 lowerP 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .令 upperExists 為以 upperP 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 lowerExists 是 true 并且 upperExists 是 true, 則以 lowerP, upperValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .以 upperP, lowerValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則如果 lowerExists 是 false 并且 upperExists 是 true, 則以 lowerP, upperValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .以 upperP 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .否則如果 lowerExists 是 true 并且 upperExists 是 false, 則以 lowerP 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .以 upperP, lowerValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則 , lowerExists 和 upperExists 都是 false不需要做任何事情 .lower 遞增 1.
- 返回 O .
reverse 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) reverse 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.shift ( )
刪除并返回?cái)?shù)組的第一個(gè)元素。
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 如果 len 是零 , 則以 "length", 0, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .返回 undefined.
- 令 first 為以 "0" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 k 為 1.
- 只要 k < len 就重復(fù)令 from 為 ToString(k).令 to 為 ToString(k–1).令 fromPresent 為以 from 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 fromPresent 是 true, 則令 fromVal 為以 from 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 to, fromVal, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則 , fromPresent 是 false以 to 和 ture 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .k 遞增 1.
- 以 ToString(len–1) 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .
- 以 "length", (len–1) , 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .
- 返回 first.
shift 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) shift 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.slice (start, end)
slice 方法需要 start 和 end 兩個(gè)參數(shù),返回一個(gè)數(shù)組,這個(gè)數(shù)組包含從第 start 個(gè)元素到 -- 但不包括 -- 第 end 個(gè)元素 ( 或如果 end 是 undefined 就到數(shù)組末尾 )。如果 start 為負(fù),它會(huì)被當(dāng)做是 length+start,這里的 length 是數(shù)組長(zhǎng)度。如果 end 為負(fù),它會(huì)被當(dāng)做是 length+end,這里的 length 是數(shù)組長(zhǎng)度。采用如下步驟:
- 令 O 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 A 為仿佛用表達(dá)式 new Array() 創(chuàng)建的新數(shù)組,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名 .
- 令 lenVal 為以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 令 relativeStart 為 ToInteger(start).
- 如果 relativeStart 為負(fù) , 令 k 為 max((len +relativeStart),0); 否則令 k 為 min(relativeStart,len).
- 如果 end 是 undefined, 令 relativeEnd 為 len; 否則令 relativeEnd 為 ToInteger(end).
- 如果 relativeEnd 為負(fù) , 令 final 為 max((len + relativeEnd),0); 否則令 final 為 min(relativeEnd,len).
- 令 n 為 0.
- 只要 k < final 就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 ToString(n), 屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法 .k 遞增 1.n 遞增 1.
- 返回 A.
slice 方法的 length 屬性是 2。
slice 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) slice 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.sort (comparefn)
給 this 數(shù)組的元素 排序。排序不一定是穩(wěn)定的(相等的元素們不一定按照他們?cè)瓉淼捻樞蚺帕校H绻?comparefn 不是 undefined,它就必須是個(gè)函數(shù),這個(gè)函數(shù)接受兩個(gè)參數(shù) x 和 y,如果 x < y 返回一個(gè)負(fù)值,如果 x = y 返回零,如果 x > y 返回一個(gè)正值。
令 obj 為以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果。
以 "length" 作為參數(shù)調(diào)用 obj 的 [[Get]] 內(nèi)部方法,將結(jié)果作為參數(shù)調(diào)用 Uint32,令 len 為返回的結(jié)果。
如果 comparefn 不是 undefined 并且不是對(duì) this 數(shù)組的元素 保持一致的比較函數(shù)(見下面),那么這種情況下 sort 的行為是實(shí)現(xiàn)定義的。
令 proto 為 obj 的 [[Prototype]] 內(nèi)部屬性。如果 proto 不是 null 并且存在一個(gè)整數(shù) j 滿足下面列出的全部條件,那么這種情況下 sort 的行為是實(shí)現(xiàn)定義的:
- obj 是 稀疏的 (15.4)
- 0 ≤ j < len
- 以 ToString(j) 作為參數(shù)調(diào)用 proto 的 [[HasProperty]] 內(nèi)部方法的結(jié)果是 true
如果 obj 是 稀疏的 并且以下任何條件為真,那么這種情況下 sort 的行為是實(shí)現(xiàn)定義的:
- obj 的 [[Extensible]] 內(nèi)部屬性是 false.
- 任何名為小于 len 的非負(fù)整數(shù)的數(shù)組索引屬性中,有 [[Configurable]] 特性是 false 的數(shù)據(jù)屬性。
任何名為小于 len 的非負(fù)整數(shù)的數(shù)組索引屬性中,有訪問器屬性,或有 [[Writable]] 特性是 false 的數(shù)據(jù)屬性,那么這種情況下 sort 的行為是實(shí)現(xiàn)定義的。
否則,采用如下步驟。
- 對(duì) obj 的 [[Get]] , [[Put]], [[Delete]] 內(nèi)部方法和 SortCompare(下面描述)執(zhí)行一個(gè)依賴于實(shí)現(xiàn)的調(diào)用序列,這里對(duì)每個(gè) [[Get]], [[Put]], 或 [[Delete]] 調(diào)用的第一個(gè)參數(shù)是小于 len 的非負(fù)整數(shù) ,SortCompare 調(diào)用的參數(shù)是前面調(diào)用 [[Get]] 內(nèi)部方法的結(jié)果。調(diào)用 [[Put]] 和 [[Delete]] 內(nèi)部方法時(shí),throw 參數(shù)是 true。如果 obj 不是 稀疏的 ,則必須不調(diào)用 [[Delete]]。
- 返回 obj。
返回的對(duì)象必須擁有下面兩個(gè)性質(zhì)。
- 必須有這樣的數(shù)學(xué)排列π,它是由比 len 小的非負(fù)整數(shù)組成 , 對(duì)于每個(gè)比 len 小的非負(fù)整數(shù) j, 如果屬性 old[j] 存在 , 則 new[π(j)] 有與 old[j] 相同的值,如果屬性 old[j] 不存在,則 new[π(j)] 也不存在。
- 對(duì)于都比 len 小的所有非負(fù)整數(shù) j 和 k,如果 SortCompare(j,k) < 0 ( 見下面的 SortCompare), 則π(j) < π(k).
這里的符號(hào) old[j] 用來指:假定在執(zhí)行這個(gè)函數(shù)之前以 j 作為參數(shù)調(diào)用 obj 的 [[Get]] 內(nèi)部方法的結(jié)果,符號(hào) new[j] 用來指:假定在執(zhí)行這個(gè)函數(shù)后以 j 作為參數(shù)調(diào)用 obj 的 [[Get]] 內(nèi)部方法的結(jié)果。
如果對(duì)于集合 S 里的任何值 a,b,c(可以是相同值),都滿足以下所有條件,那么函數(shù) comparefn 是在集合 S 上保持一致的比較函數(shù)(以下,符號(hào) a <CF b 表示 comparefn(a,b) < 0;符號(hào) a =CF b 表示 comparefn(a,b) = 0(不論正負(fù)); 符號(hào) a >CF b 表示 comparefn(a,b) > 0):
- 當(dāng)用指定值 a 和 b 作為兩個(gè)參數(shù)調(diào)用 comparefn(a,b),總是返回相同值 v。此外 Type(v) 是 Number, 并且 v 不是 NaN。注意,這意味著對(duì)于給定的 a 和 b,a <CF b, a =CF b, and a >CF b 中正好有一個(gè)是真。
- 調(diào)用 comparefn(a,b) 不改變 this 對(duì)象。
- a =CF a ( 自反性 )
- 如果 a =CF b, 則 b =CF a ( 對(duì)稱性 )
- 如果 a =CF b 并且 b =CF c, 則 a =CF c (=CF 傳遞 )
- 如果 a <CF b 并且 b <CF c, 則 a <CF c (<CF 傳遞 )
- 如果 a >CF b 并且 b >CF c, 則 a >CF c (>CF 傳遞 )
這些條件是確保 comparefn 劃分集合 S 為等價(jià)類并且是完全排序等價(jià)類的充分必要條件。
當(dāng)用兩個(gè)參數(shù) j 和 k 調(diào)用抽象操作 SortCompare,采用如下步驟:
- 令 jString 為 ToString(j).
- 令 kString 為 ToString(k).
- 令 hasj 為 以 jString 作為參數(shù)調(diào)用 obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果。
- 令 hask 為 以 kString 作為參數(shù)調(diào)用 obj 的 [[HasProperty]] 內(nèi)部方法的結(jié)果。
- 如果 hasj 和 hask 都是 false, 則返回 +0.
- 如果 hasj 是 false, 則返回 1.
- 如果 hask 是 false, 則返回 –1.
- 令 x 為 以 jString 作為參數(shù)調(diào)用 obj 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 令 y 為 以 kString 作為參數(shù)調(diào)用 obj 的 [[Get]] 內(nèi)部方法的結(jié)果。
- 如果 x 和 y 都是 undefined, 返回 +0.
- 如果 x 是 undefined, 返回 1.
- 如果 y 是 undefined, 返回 ?1.
- 如果 參數(shù) comparefn 不是 undefined, 則如果 IsCallable(comparefn) 是 false, 拋出一個(gè) TypeError 異常 .傳入 undefined 作為 this 值,以 x 和 y 作為參數(shù)調(diào)用 comparefn 的 [[Call]] 內(nèi)部方法,返回結(jié)果。
- 令 xString 為 ToString(x).
- 令 yString 為 ToString(y).
- 如果 xString < yString, 返回 ?1.
- 如果 xString > yString, 返回 1.
- 返回 +0.
因?yàn)椴淮嬖诘膶傩灾悼偸潜?undefined 屬性值大,并且 undefined 屬性值總是比任何其他值大,所以 undefined 屬性值總是排在結(jié)果的末尾,后面跟著不存在屬性值。
sort 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) sort 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
當(dāng)以兩個(gè)或更多參數(shù) start, deleteCount 和 ( 可選的 ) item1, item2, 等等,調(diào)用 splice 方法,從數(shù)組索引 start 開始的 deleteCount 個(gè)數(shù)組元素會(huì)被替換為參數(shù) item1, item2, 等等。返回一個(gè)包含參數(shù)元素(如果有)的數(shù)組。采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 A 為 仿佛用表達(dá)式 new Array() 創(chuàng)建的新數(shù)組,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名。
- 令 lenVal 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 令 relativeStart 為 ToInteger(start).
- 如果 relativeStart 為負(fù) , 令 actualStart 為 max((len + relativeStart),0); 否則令 actualStart 為 min(relativeStart, len).
- 令 actualDeleteCount 為 min(max(ToInteger(deleteCount),0),len – actualStart).
- 令 k 為 0.
- 只要 k < actualDeleteCount 就重復(fù)令 from 為 ToString(actualStart+k).令 fromPresent 為 以 from 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果。如果 fromPresent 是 true, 則令 fromValue 為 以 from 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果。以 ToString(k), 屬性描述符 {[[Value]]: fromValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法。k 遞增 1.
- 令 items 為一個(gè)內(nèi)部列表,它的元素是實(shí)際參數(shù)列表中 item1 開始的參數(shù)(從左到右的順序)。如果沒傳入這些項(xiàng)目,則列表是空的。
- 令 itemCount 為 items 的元素個(gè)數(shù) .
- 如果 itemCount < actualDeleteCount, 則令 k 為 actualStart.只要 k < (len – actualDeleteCount) 就重復(fù)令 from 為 ToString(k+actualDeleteCount).令 to 為 ToString(k+itemCount).令 fromPresent 為 以 from 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 fromPresent 是 true, 則令 fromValue 為 以 from 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 to, fromValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則 , fromPresent 是 false以 to 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .k 遞增 1.令 k 為 len.只要 k > (len – actualDeleteCount +itemCount) 就重復(fù)以 ToString(k–1) 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .k 遞減 1.
- 否則如果 itemCount > actualDeleteCount, 則令 k 為 (len – actualDeleteCount).只要 k > actualStart 就重復(fù)令 from 為 ToString(k + actualDeleteCount – 1).令 to 為 ToString(k + itemCount – 1)令 fromPresent 為 以 from 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 fromPresent 是 true, 則令 fromValue 為 以 from 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 to, fromValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則 , fromPresent 是 false以 to 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .k 遞減 1.
- 令 k 為 actualStart.
- 只要 items 不是空 就重復(fù)刪除 items 的第一個(gè)元素 , 并令 E 為這個(gè)元素值 .以 ToString(k), E, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .k 遞增 1.
- 以 "length", (len – actualDeleteCount + itemCount), 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .
- 返回 A.
splice 方法的 length 屬性是 2。
splice 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) splice 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
將參數(shù)們插入到數(shù)組的開始位置,它們?cè)跀?shù)組中的順序與它們出現(xiàn)在參數(shù)列表中的順序相同。
當(dāng)以零或更多個(gè)參數(shù) item1,item2, 等等,調(diào)用 unshift 方法,采用如下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenVal 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenVal).
- 令 argCount 為 實(shí)際參數(shù)的個(gè)數(shù) .
- 令 k 為 len.
- 只要 k > 0, 就重復(fù)令 from 為 ToString(k–1).令 to 為 ToString(k+argCount –1).令 fromPresent 為 以 from 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 fromPresent 是 true, 則令 fromValue 為 以 from 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 to, fromValue, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .否則 , fromPresent 是 false以 to 和 true 作為參數(shù)調(diào)用 O 的 [[Delete]] 內(nèi)部方法 .k 遞減 1.
- 令 j 為 0.
- 令 items 為一個(gè)內(nèi)部列表,它的元素是調(diào)用這個(gè)函數(shù)時(shí)傳入的實(shí)際參數(shù)(從左到右的順序)。
- 只要 items 不是空,就重復(fù)刪除 items 的第一個(gè)元素,并令 E 為這個(gè)元素值 .以 ToString(j), E, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .j 遞增 1.
- 以 "length", len+argCount, 和 true 作為參數(shù)調(diào)用 O 的 [[Put]] 內(nèi)部方法 .
- 返回 len+argCount.
unshift 方法的 length 屬性是 1。
unshift 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) unshift 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.indexOf ( searchElement [ , fromIndex ] )
indexOf 按照索引的升序比較 searchElement 和數(shù)組里的元素們,它使用內(nèi)部的嚴(yán)格相等比較算法 (11.9.6),如果找到一個(gè)或更多這樣的位置,返回這些位置中第一個(gè)索引;否則返回 -1。
可選的第二個(gè)參數(shù) fromIndex 默認(rèn)是 0(即搜索整個(gè)數(shù)組)。如果它大于或等于數(shù)組長(zhǎng)度,返回 -1,即不會(huì)搜索數(shù)組。如果它是負(fù)的,就把它當(dāng)作從數(shù)組末尾到計(jì)算后的 fromIndex 的偏移量。如果計(jì)算后的索引小于 0,就搜索整個(gè)數(shù)組。
當(dāng)用一個(gè)或兩個(gè)參數(shù)調(diào)用 indexOf 方法 , 采用以下步驟 :
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 len 是 0, 返回 -1.
- 如果 傳入了參數(shù) 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,就重復(fù)令 kPresent 為 以 ToString(k) 為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 elementK 為 以 ToString(k) 為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 same 為 對(duì) searchElement 和 elementK 執(zhí)行嚴(yán)格相等比較算法的結(jié)果 .如果 same 是 true, 返回 k.k 遞增 1.
- 返回 -1.
indexOf 方法的 length 屬性是 1。
indexOf 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) indexOf 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
lastIndexOf 按照索引的降序比較 searchElement 和數(shù)組里的元素們,它使用內(nèi)部的嚴(yán)格相等比較算法 (11.9.6),如果找到一個(gè)或更多這樣的位置,返回這些位置中最后一個(gè)索引;否則返回 -1。
可選的第二個(gè)參數(shù) fromIndex 默認(rèn)是數(shù)組的長(zhǎng)度減一(即搜索整個(gè)數(shù)組)。如果它大于或等于數(shù)組長(zhǎng)度,將會(huì)搜索整個(gè)數(shù)組。如果它是負(fù)的,就把它當(dāng)作從數(shù)組末尾到計(jì)算后的 fromIndex 的偏移量。如果計(jì)算后的索引小于 0,返回 -1。
當(dāng)用一個(gè)或兩個(gè)參數(shù)調(diào)用 lastIndexOf 方法,采用如下步驟 :
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 len is 0, 返回 -1.
- 如果 傳入了參數(shù) fromIndex, 則令 n 為 ToInteger(fromIndex); 否則令 n 為 len.
- 如果 n ≥ 0, 則令 k 為 min(n, len – 1).
- 否則 , n < 0令 k 為 len - abs(n).
- 只要 k≥ 0 就重復(fù)令 kPresent 為 以 ToString(k) 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 elementK 為 以 ToString(k) 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 same 為 對(duì) searchElement 和 elementK 執(zhí)行嚴(yán)格相等比較算法的結(jié)果 .如果 same 是 true, 返回 k.k 遞減 1.
- 返回 -1.
lastIndexOf 方法的 length 屬性是 1。
lastIndexOf 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) lastIndexOf 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.every ( callbackfn [ , thisArg ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它接受三個(gè)參數(shù)并返回一個(gè)可轉(zhuǎn)換為布爾值 true 和 false 的值。every 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素調(diào)用一次 callbackfn,直到他找到一個(gè)使 callbackfn 返回 false 的元素。如果找到這樣的元素,every 馬上返回 false,否則如果對(duì)所有元素 callbackfn 都返回 true,every 將返回 true。callbackfn 只被數(shù)組里實(shí)際存在的元素調(diào)用;它不會(huì)被缺少的元素調(diào)用。
如果提供了一個(gè) thisArg 參數(shù),它會(huì)被當(dāng)作 this 值傳給每個(gè) callbackfn 調(diào)用。如果沒提供它,用 undefined 替代。
調(diào)用 callbackfn 時(shí)將傳入三個(gè)參數(shù):元素的值,元素的索引,和遍歷的對(duì)象。
對(duì) every 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
every 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 every 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,every 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 every 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。every 的行為就像數(shù)學(xué)量詞“所有(for all)”。特別的,對(duì)一個(gè)空數(shù)組,它返回 true。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 every 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果提供了 thisArg, 令 T 為 thisArg; 否則令 T 為 undefined.
- 令 k 為 0.
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 testResult 為 以 T 作為 this 值以包含 kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .如果 ToBoolean(testResult) 是 false, 返回 false.k 遞增 1.
- 返回 true.
every 方法的 length 屬性是 1。
every 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) every 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.some ( callbackfn [ , thisArg ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它接受三個(gè)參數(shù)并返回一個(gè)可轉(zhuǎn)換為布爾值 true 和 false 的值。some 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素調(diào)用一次 callbackfn,直到他找到一個(gè)使 callbackfn 返回 true 的元素。如果找到這樣的元素,some 馬上返回 true,否則,some 返回 false。callbackfn 只被實(shí)際存在的數(shù)組元素調(diào)用;它不會(huì)被缺少的數(shù)組元素調(diào)用。
如果提供了一個(gè) thisArg 參數(shù),它會(huì)被當(dāng)作 this 值傳給每個(gè) callbackfn 調(diào)用。如果沒提供它,用 undefined 替代。
調(diào)用 callbackfn 時(shí)將傳入三個(gè)參數(shù):元素的值,元素的索引,和遍歷的對(duì)象。
對(duì) some 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
some 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 some 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,some 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 some 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。some 的行為就像數(shù)學(xué)量詞“存在(exists)”。特別的,對(duì)一個(gè)空數(shù)組,它返回 false。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 some 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果提供了 thisArg, 令 T 為 thisArg; 否則令 T 為 undefined.
- 令 k 為 0.
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 testResult 為 以 T 作為 this 值以包含 kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .如果 ToBoolean(testResult) 是 true, 返回 true.k 遞增 1.
- 返回 false.
some 方法的 length 屬性是 1。
some 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) some 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.forEach ( callbackfn [ , thisArg ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它接受三個(gè)參數(shù)。forEach 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素調(diào)用一次 callbackfn。callbackfn 只被實(shí)際存在的數(shù)組元素調(diào)用;它不會(huì)被缺少的數(shù)組元素調(diào)用。
如果提供了一個(gè) thisArg 參數(shù),它會(huì)被當(dāng)作 this 值傳給每個(gè) callbackfn 調(diào)用。如果沒提供它,用 undefined 替代。
調(diào)用 callbackfn 時(shí)將傳入三個(gè)參數(shù):元素的值,元素的索引,和遍歷的對(duì)象。
對(duì) forEach 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
forEach 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 forEach 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,forEach 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 forEach 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 forEach 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果提供了 thisArg, 令 T 為 thisArg; 否則令 T 為 undefined.
- 令 k 為 0.
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .以 T 作為 this 值以包含 kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法 .k 遞增 1.
- 返回 undefined.
forEach 方法的 length 屬性是 1。
forEach 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) forEach 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.map ( callbackfn [ , thisArg ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它接受三個(gè)參數(shù)。map 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素調(diào)用一次 callbackfn,并用結(jié)果構(gòu)造一個(gè)新數(shù)組。callbackfn 只被實(shí)際存在的數(shù)組元素調(diào)用;它不會(huì)被缺少的數(shù)組元素調(diào)用。
如果提供了一個(gè) thisArg 參數(shù),它會(huì)被當(dāng)作 this 值傳給每個(gè) callbackfn 調(diào)用。如果沒提供它,用 undefined 替代。
調(diào)用 callbackfn 時(shí)將傳入三個(gè)參數(shù):元素的值,元素的索引,和遍歷的對(duì)象。
對(duì) map 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
map 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 map 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,map 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 map 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 map 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果提供了 thisArg, 令 T 為 thisArg; 否則令 T 為 undefined.
- 令 A 為 仿佛用 new Array( len) 創(chuàng)建的新數(shù)組,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名,len 是 len 的值。
- 令 k 為 0.
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 mappedValue 為 以 T 作為 this 值以包含 kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .以 Pk, 屬性描述符 {[[Value]]: mappedValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法 .k 遞增 1.
- 返回 A.
map 方法的 length 屬性是 1。
map 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) map 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.filter ( callbackfn [ , thisArg ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它接受三個(gè)參數(shù)并返回一個(gè)可轉(zhuǎn)換為布爾值 true 和 false 的值。filter 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素調(diào)用一次 callbackfn,并用使 callbackfn 返回 true 的所有值構(gòu)造一個(gè)新數(shù)組。callbackfn 只被實(shí)際存在的數(shù)組元素調(diào)用;它不會(huì)被缺少的數(shù)組元素調(diào)用。
如果提供了一個(gè) thisArg 參數(shù),它會(huì)被當(dāng)作 this 值傳給每個(gè) callbackfn 調(diào)用。如果沒提供它,用 undefined 替代。
調(diào)用 callbackfn 時(shí)將傳入三個(gè)參數(shù):元素的值,元素的索引,和遍歷的對(duì)象。
對(duì) filter 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
filter 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 filter 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,filter 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 filter 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 filter 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果提供了 thisArg, 令 T 為 thisArg; 否則令 T 為 undefined.
- 令 A 為 仿佛用 new Array( len) 創(chuàng)建的新數(shù)組,這里的 Array 是標(biāo)準(zhǔn)內(nèi)置構(gòu)造器名,len 是 len 的值。
- 令 k 為 0.
- 令 to 為 0.
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 selected 為 以 T 作為 this 值以包含 kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .如果 ToBoolean(selected) 是 true, 則以 ToString(to), 屬性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作為參數(shù)調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法 .to 遞增 1.k 遞增 1.
- 返回 A.
filter 方法的 length 屬性是 1。
filter 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) filter 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.reduce ( callbackfn [ , initialValue ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它需要四個(gè)參數(shù)。reduce 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素 , 將 callbackfn 作為回調(diào)函數(shù)調(diào)用一次。
調(diào)用 callbackfn 時(shí)將傳入四個(gè)參數(shù):previousValue(initialValue 的值或上次調(diào)用 callbackfn 的返回值),currentValue(當(dāng)前元素值),currentIndex,和遍歷的對(duì)象。第一次調(diào)用回調(diào)函數(shù)時(shí),previousValue 和 currentValue 的取值可以是下面兩種情況之一。如果為 reduce 調(diào)用提供了一個(gè) initialValue,則 previousValue 將等于 initialValue 并且 currentValue 將等于數(shù)組的首個(gè)元素值。如果沒提供 initialValue,則 previousValue 將等于數(shù)組的首個(gè)元素值并且 currentValue 將等于數(shù)組的第二個(gè)元素值。如果數(shù)組里沒有元素并且沒有提供 initialValue,則拋出一個(gè) TypeError 異常。
對(duì) reduce 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
reduce 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 reduce 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,reduce 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 reduce 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 reduce 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue ).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果 len 是 0 并且 initialValue 不是 present, 拋出一個(gè) TypeError 異常 .
- 令 k 為 0.
- 如果 initialValue 參數(shù)有傳入值 , 則設(shè)定 accumulator 為 initialValue.
- 否則 , initialValue 參數(shù)沒有傳入值令 kPresent 為 false.只要 kPresent 是 false 并且 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 accumulator 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .k 遞增 1.如果 kPresent 是 false, 拋出一個(gè) TypeError 異常 .
- 只要 k < len ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 accumulator 為 以 undefined 作為 this 值并以包含 accumulator, kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .k 遞增 1.
- 返回 accumulator.
reduce 方法的 length 屬性是 1。
reduce 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) reduce 函數(shù)是依賴于實(shí)現(xiàn)的。
Array.prototype.reduceRight ( callbackfn [ , initialValue ] )
callbackfn 應(yīng)該是個(gè)函數(shù),它需要四個(gè)參數(shù)。reduceRight 按照索引的升序,對(duì)數(shù)組里存在的每個(gè)元素 , 將 callbackfn 作為回調(diào)函數(shù)調(diào)用一次。
調(diào)用 callbackfn 時(shí)將傳入四個(gè)參數(shù):previousValue(initialValue 的值或上次調(diào)用 callbackfn 的返回值),currentValue(當(dāng)前元素值),currentIndex,和遍歷的對(duì)象。第一次調(diào)用回調(diào)函數(shù)時(shí),previousValue 和 currentValue 的取值可以是下面兩種情況之一。如果為 reduceRight 調(diào)用提供了一個(gè) initialValue,則 previousValue 將等于 initialValue 并且 currentValue 將等于數(shù)組的最后一個(gè)元素值。如果沒提供 initialValue,則 previousValue 將等于數(shù)組的最后一個(gè)元素值并且 currentValue 將等于數(shù)組的倒數(shù)第二個(gè)元素值。如果數(shù)組里沒有元素并且沒有提供 initialValue,則拋出一個(gè) TypeError 異常。
對(duì) reduceRight 的調(diào)用不直接更改對(duì)象,但是對(duì) callbackfn 的調(diào)用可能更改對(duì)象。
reduceRight 處理的元素范圍是在首次調(diào)用 callbackfn 之前設(shè)定的。在 reduceRight 調(diào)用開始后追加到數(shù)組里的元素們不會(huì)被 callbackfn 訪問。如果更改以存在數(shù)組元素,reduceRight 訪問這些元素時(shí)的值會(huì)傳給 callbackfn;在 reduceRight 調(diào)用開始后刪除的和之前被訪問過的元素們是不訪問的。
當(dāng)以一個(gè)或兩個(gè)參數(shù)調(diào)用 reduceRight 方法,采用以下步驟:
- 令 O 為 以 this 值作為參數(shù)調(diào)用 ToObject 的結(jié)果 .
- 令 lenValue 為 以 "length" 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .
- 令 len 為 ToUint32(lenValue ).
- 如果 IsCallable(callbackfn) 是 false, 拋出一個(gè) TypeError 異常 .
- 如果 len 是 0 并且 initialValue 不是 present, 拋出一個(gè) TypeError 異常 .
- 令 k 為 0.
- 如果 initialValue 參數(shù)有傳入值 , 則設(shè)定 accumulator 為 initialValue.
- 否則 , initialValue 參數(shù)沒有傳入值令 kPresent 為 false.只要 kPresent 是 false 并且 k ≥ 0 ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 accumulator 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .k 遞減 1.如果 kPresent 是 false, 拋出一個(gè) TypeError 異常 .
- 只要 k ≥ 0 ,就重復(fù)令 Pk 為 ToString(k).令 kPresent 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[HasProperty]] 內(nèi)部方法的結(jié)果 .如果 kPresent 是 true, 則令 kValue 為 以 Pk 作為參數(shù)調(diào)用 O 的 [[Get]] 內(nèi)部方法的結(jié)果 .令 accumulator 為 以 undefined 作為 this 值并以包含 accumulator, kValue, k, 和 O 的參數(shù)列表調(diào)用 callbackfn 的 [[Call]] 內(nèi)部方法的結(jié)果 .k 遞減 1.
- 返回 accumulator.
reduceRight 方法的 length 屬性是 1。
reduceRight 函數(shù)被有意設(shè)計(jì)成通用的;它的 this 值并非必須是數(shù)組對(duì)象。因此,它可以作為方法轉(zhuǎn)移到其他類型的對(duì)象中。一個(gè)宿主對(duì)象是否可以正確應(yīng)用這個(gè) reduceRight 函數(shù)是依賴于實(shí)現(xiàn)的。
Array 實(shí)例的屬性
Array 實(shí)例從數(shù)組原型對(duì)象繼承屬性,Array 實(shí)例的 [[Class]] 內(nèi)部屬性是 "Array"。Array 實(shí)例還有以下屬性。
[[DefineOwnProperty]] ( P, Desc, Throw )
數(shù)組對(duì)象使用一個(gè),用在其他原生 ECMAscript 對(duì)象的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9) 的變化版。
設(shè) A 為一個(gè)數(shù)組對(duì)象,Desc 為一個(gè)屬性描述符,Throw 為一個(gè)布爾標(biāo)示。
在以下算法中,術(shù)語(yǔ)“拒絕”指代“如果 Throw 是 true,則拋出 TypeError 異常,否則返回 false。
當(dāng)用屬性名 P,屬性描述 Desc,布爾值 Throw 調(diào)用 A 的 [[DefineOwnProperty]] 內(nèi)部方法,采用以下步驟:
- 令 oldLenDesc 為 以 "length" 作為參數(shù)調(diào)用 A 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果。 結(jié)果絕不會(huì)是 undefined 或一個(gè)訪問器描述符,因?yàn)樵趧?chuàng)建數(shù)組時(shí)的 length 是一個(gè)不可刪除或重新配置的數(shù)據(jù)屬性。
- 令 oldLen 為 oldLenDesc.[[Value]].
- 如果 P 是 "length", 則如果 Desc 的 [[Value]] 字段不存在 , 則以 "length", Desc, 和 Throw 作為參數(shù)在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9),返回結(jié)果。令 newLenDesc 為 Desc 的一個(gè)拷貝 .令 newLen 為 ToUint32(Desc.[[Value]]).如果 newLen 不等于 ToNumber( Desc.[[Value]]), 拋出一個(gè) RangeError 異常 .設(shè)定 newLenDesc.[[Value]] 為 newLen.如果 newLen ≥oldLen, 則以 "length", newLenDesc, 和 Throw 作為參數(shù)在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9),返回結(jié)果。如果 oldLenDesc.[[Writable]] 是 false,拒絕如果 newLenDesc.[[Writable]] 不存在或值是 true, 令 newWritable 為 true.否則 ,因?yàn)樗鼘⑹沟脽o法刪除任何元素,所以需要延后設(shè)定 [[Writable]] 特性為 false.令 newWritable 為 false.設(shè)定 newLenDesc.[[Writable]] 為 true.令 succeeded 為 以 "length", newLenDesc, 和 Throw 作為參數(shù)在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9) 的結(jié)果如果 succeeded 是 false, 返回 false..只要 newLen < oldLen,就重復(fù) ,設(shè)定 oldLen 為 oldLen – 1.令 deleteSucceeded 為 以 ToString(oldLen) 和 false 作為參數(shù)調(diào)用 A 的 [[Delete]] 內(nèi)部方法的結(jié)果 .如果 deleteSucceeded 是 false, 則設(shè)定 newLenDesc.[[Value]] 為 oldLen+1.如果 newWritable 是 false, 設(shè)定 newLenDesc.[[Writable]] 為 false.以 "length", newLenDesc, 和 false 為參數(shù)在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9).拒絕 .如果 newWritable 是 false, 則以 "length", 屬性描述符 {[[Writable]]: false}, 和 false 作為參數(shù)在 A 上調(diào)用 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9). 這個(gè)調(diào)用始終返回 true.返回 true.
- 否則如果 P 是一個(gè)數(shù)組索引 (15.4), 則令 index 為 ToUint32(P).如果 index ≥ oldLen 并且 oldLenDesc.[[Writable]] 是 false,拒絕 .令 succeeded 為 以 P, Desc, 和 false 作為參數(shù)在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9) 的結(jié)果 .如果 succeeded 是 false,拒絕 .如果 index ≥ oldLen設(shè)定 oldLenDesc.[[Value]] 為 index + 1.以 "length", oldLenDesc, 和 false 作為參數(shù)在在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9). 這個(gè)調(diào)用始終返回 true.返回 true.
- 以 P, Desc, 和 Throw 作為參數(shù)在在 A 上調(diào)用默認(rèn)的 [[DefineOwnProperty]] 內(nèi)部方法 (8.12.9),返回結(jié)果 .
length
數(shù)組對(duì)象的 length 屬性是個(gè)數(shù)據(jù)屬性,其值總是在數(shù)值上大于任何屬性名是數(shù)組索引的可刪除屬性的屬性名。
length 屬性擁有的初始特性是 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
試圖將一個(gè)數(shù)組對(duì)象的 length 屬性設(shè)定為在數(shù)值上比 -- 數(shù)組中存在數(shù)組索引并且是不可參數(shù)屬性中的最大數(shù)字屬性名 -- 小或相等時(shí),length 將設(shè)定為比那個(gè)最大數(shù)字屬性名大一的數(shù)字子。見 15.4.5.1。
更多建議: