学会微笑

ECMA-262 7ᵗʰ Edition 第 22 章

学会微笑 · 2017-01-05翻译 · 3690阅读 原文链接

22 索引的集合#

<emu-clause id="sec-array-objects">

22.1 Array对象#

Array对象是会对某些属性名特殊处理的外来对象。看<emu-xref href="#sec-array-exotic-objects">9.4.2</emu-xref>可以了解这些特殊处理的定义。

<emu-clause id="sec-array-constructor">

22.1.1 Array构造函数#

Array构造函数是<emu-xref href="#global-object">全局对象</emu-xref>Array属性的内部对象和初始值。当作为构造函数被调用,它创建并且初始化一个新的Array对象,当作为一个函数被调用而不是构造函数,它也会创建和初始化一个新的Array对象。因此,相同参数的方法调用 Array(…)和对象创建表达式new Array(…)是等价的。

Array构造函数是一个单一的方法,它的行为基于参数的个数和类型被重载。

Array构造函数设计成可派生的。它可能被当成一个类定义的extends语句的值来使用。想要继承外来Array对象行为的子类构造函数必须包含一个对Array构造函数的super调用来初始化一个外来Array对象子类的实例。另一方面,作为一个外来对象,大部分Array.prototype方法是一个不依赖this值的通用方法。

Array构造函数的length属性是1。

<emu-clause id="sec-array-constructor-array">

22.1.1.1 Array()#

这个描述应用在当且仅当Array构造函数在没有参数的情况下调用。

<emu-alg>

  1. 让<var>numberOfArgs</var>作为参数的个数传递给方法调用。
  2. 断言: <var>numberOfArgs</var> = 0。
  3. 如果NewTarget等于<emu-val>undefined</emu-val>,让NewTarget成为<emu-xref href="#active-function-object">活跃的方法对象</emu-xref>,否则不变。
  4. 让<var>proto</var> = <emu-xref aoid="GetPrototypeFromConstructor">GetPrototypeFromConstructor</emu-xref>(<var>newTarget</var>, "%ArrayPrototype%")。
  5. 返回<emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(0, <var>proto</var>)。

</emu-alg></emu-clause><emu-clause id="sec-array-len">

22.1.1.2Array (<var>len</var>)#

这个描述应用在当且仅当Array构造函数在只有一个参数的情况下调用。

<emu-alg>

  1. <var>numberOfArgs</var>作为参数的个数传递给方法调用。
  2. 断言: <var>numberOfArgs</var> = 1。
  3. 如果NewTarget等于<emu-val>undefined</emu-val>,让NewTarget成为<emu-xref href="#active-function-object">活跃的方法对象</emu-xref>,否则不变。
  4. 让<var>proto</var>=<emu-xref aoid="GetPrototypeFromConstructor">GetPrototypeFromConstructor</emu-xref>(<var>newTarget</var>, "%ArrayPrototype%")。
  5. 让array = <emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(0, <var>proto</var>)。
  6. 如果(<var>len</var>)的<emu-xref aoid="Type">类型</emu-xref>不是Number,那么 1、 让<var>defineStatus</var> = <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>array</var>, "0", <var>len</var>)。 2、 断言: <var>defineStatus</var> = <emu-val>true</emu-val>。 3、 让<var>intLen</var> = 1。
  7. 否则, 1、 让<var>intLen</var> = <emu-xref aoid="ToUint32">ToUint32</emu-xref>(<var>len</var>)。 2、 如果<var>intLen</var> ≠ <var>len</var>, 抛出<emu-val>RangeError</emu-val>异常。
  8. 执行! <emu-xref aoid="Set">Set</emu-xref>(<var>array</var>, "length", <var>intLen</var>, <emu-val>true</emu-val>)。
  9. 返回<var>array</var>。

</emu-alg></emu-clause><emu-clause id="sec-array-items">

22.1.1.3 Array(...<var>items</var> )#

这个描述应用在当且仅当Array构造函数在至少有两个参数的情况下调用。

Array方法被调用,会发生以下步骤:

<emu-alg>

  1. 让<var>numberOfArgs</var>作为参数的个数传递给方法调用。
  2. 断言: <var>numberOfArgs</var> ≥ 2。
  3. 如果NewTarget等于<emu-val>undefined</emu-val>,让NewTarget成为<emu-xref href="#active-function-object">活跃的方法对象</emu-xref>,否则不变。
  4. 让<var>proto</var> = <emu-xref aoid="GetPrototypeFromConstructor">GetPrototypeFromConstructor</emu-xref>(<var>newTarget</var>, "%ArrayPrototype%")。
  5. 让<var>array</var> = <emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(<var>numberOfArgs</var>, <var>proto</var>)。
  6. 让<var>k</var> = 0。
  7. 让<var>items</var>等于一个零开始的包含顺序参数列表的<emu-xref href="#sec-list-and-record-specification-type">List</emu-xref>。
  8. 重复, 当<var>k</var> < <var>numberOfArgs</var>
    1. 让<var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让<var>itemK</var> = <var>items</var>[<var>k</var>]。
    3. 让<var>defineStatus</var> = <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>array</var>, <var>Pk</var>, <var>itemK</var>)。
    4. 断言: <var>defineStatus</var> = <emu-val>true</emu-val>。
    5. <var>k</var>加1。
  9. 断言: <var>array</var>的length属性为<var>numberOfArgs</var>。
  10. 返回<var>array</var>。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-properties-of-the-array-constructor">

22.1.2 Array构造函数的属性#

Array构造函数的[[Prototype]]内部位置的值是原有对象的<emu-xref href="#sec-properties-of-the-function-prototype-object">%FunctionPrototype%</emu-xref>。

Array构造函数有以下属性:

<emu-clause id="sec-array.from">

22.1.2.1Array.from( <var>items</var> [ , <var>mapfn</var> [ , <var>thisArg</var> ] ] )#

from方法带着<var>items</var>参数以及可选参数<var>mapfn</var>和<var>thisArg</var>调用,会发生以下步骤:

<emu-alg>

  1. 让<var>C</var> = <emu-val>this</emu-val>。
  2. 如果<var>mapfn</var>等于<emu-val>undefined</emu-val>, 让<var>mapping</var> = <emu-val>false</emu-val>。
  3. 否则,
    1. 如果<emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>mapfn</var>)等于<emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    2. 如果<var>thisArg</var>有定义, 让<var>T</var> = <var>thisArg</var>; 否则让<var>T</var> = <emu-val>undefined</emu-val>。
    3. 让<var>mapping</var> = <emu-val>true</emu-val>。
  4. 让<var>usingIterator</var> = <emu-xref aoid="GetMethod">GetMethod</emu-xref>(<var>items</var>, @@iterator)。
  5. 如果<var>usingIterator</var>不等于<emu-val>undefined</emu-val>, 那么
    1. 如果<emu-xref aoid="IsConstructor">IsConstructor</emu-xref>(<var>C</var>)等于<emu-val>true</emu-val>,那么
      1. 让<var>A</var> = <emu-xref aoid="Construct">Construct</emu-xref>(<var>C</var>)。
    2. 否则,
      1. 让<var>A</var> = <emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(0)。
    3. 让 <var>iterator</var> = <emu-xref aoid="GetIterator">GetIterator</emu-xref>(<var>items</var>, <var>usingIterator</var>)。
    4. 让 <var>k</var> = 0。
    5. 重复
      1. 如果 <var>k</var> ≥ 253-1, 那么
        1. 让 <var>error</var> = <emu-xref aoid="Completion">Completion</emu-xref>{[[Type]]: <emu-const>throw</emu-const>, [[Value]]: a newly created <emu-val>TypeError</emu-val> object, [[Target]]: <emu-const>empty</emu-const>}。
        2. 返回 <emu-xref aoid="IteratorClose">IteratorClose</emu-xref>(<var>iterator</var>, <var>error</var>)。
      2. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
      3. 让 <var>next</var> = <emu-xref aoid="IteratorStep">IteratorStep</emu-xref>(<var>iterator</var>)。
      4. 如果 <var>next</var> 等于 <emu-val>false</emu-val>, 那么
        1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>k</var>, <emu-val>true</emu-val>)。
        2. 返回 <var>A</var>。
      5. 让 <var>nextValue</var> = <emu-xref aoid="IteratorValue">IteratorValue</emu-xref>(<var>next</var>)。
      6. 如果 <var>mapping</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>mappedValue</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>mapfn</var>, <var>T</var>, « <var>nextValue</var>, <var>k</var> »)。
        2. 如果 <var>mappedValue</var> 等于 an <emu-xref href="#sec-completion-record-specification-type">abrupt completion</emu-xref>, 返回 <emu-xref aoid="IteratorClose">IteratorClose</emu-xref>(<var>iterator</var>, <var>mappedValue</var>)。
        3. 让 <var>mappedValue</var> = <var>mappedValue</var>.[[Value]]。
      7. 否则, 让 <var>mappedValue</var> = <var>nextValue</var>。
      8. 让 <var>defineStatus</var> = <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <var>Pk</var>, <var>mappedValue</var>)。
      9. 如果 <var>defineStatus</var> 是一个 <emu-xref href="#sec-completion-record-specification-type">abrupt completion</emu-xref>, 返回 <emu-xref aoid="IteratorClose">IteratorClose</emu-xref>(<var>iterator</var>, <var>defineStatus</var>)。
      10. <var>k</var> 加 1。
  6. 注释: <var>items</var> 不可迭代因此假设他是一个类数组。
  7. 让 <var>arrayLike</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<var>items</var>)。
  8. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, "length"))。
  9. 如果 <emu-xref aoid="IsConstructor">IsConstructor</emu-xref>(<var>C</var>) 等于 <emu-val>true</emu-val>, 那么
    1. 让 <var>A</var> = <emu-xref aoid="Construct">Construct</emu-xref>(<var>C</var>, « <var>len</var> »)。
  10. 否则,
    1. 让 <var>A</var> = <emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(<var>len</var>)。
  11. 让 <var>k</var> = 0。
  12. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, <var>Pk</var>)。
    3. 如果 <var>mapping</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>mappedValue</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>mapfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var> »)。
    4. 否则, 让 <var>mappedValue</var> = <var>kValue</var>。
    5. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <var>Pk</var>, <var>mappedValue</var>)。
    6. <var>k</var> 加 1。
  13. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>len</var>, <emu-val>true</emu-val>)。
  14. 返回 <var>A</var>。

</emu-alg><emu-note>注释

from函数是一个特意的通用的工厂方法; 它不要求<emu-val>this</emu-val>的值是一个数组构造函数。 因此它可以被其他任何构造函数通过以单个数字参数调用来转变或者继承。

</emu-note></emu-clause><emu-clause id="sec-array.isarray">

22.1.2.2Array.isArray ( <var>arg</var> )#

isArray有一个参数<var>arg</var>, 步骤如下:

<emu-alg>

  1. 返回 <emu-xref aoid="IsArray">IsArray</emu-xref>(<var>arg</var>)。

</emu-alg></emu-clause><emu-clause id="sec-array.of">

22.1.2.3Array.of ( ...<var>items</var> )#

of方法以任何数量的参数调用, 都是以下步骤发生:

<emu-alg>

  1. 让 <var>len</var> 等于调用时传给函数的参数个数。
  2. 让 <var>items</var>等于传给函数参数的<emu-xref href="#sec-list-and-record-specification-type">List</emu-xref>。
  3. 让 <var>C</var> = <emu-val>this</emu-val>。
  4. 如果 <emu-xref aoid="IsConstructor">IsConstructor</emu-xref>(<var>C</var>) is <emu-val>true</emu-val>, 那么
    1. 让 <var>A</var> = <emu-xref aoid="Construct">Construct</emu-xref>(<var>C</var>, « <var>len</var> »)。
  5. 否则,
    1. 让 <var>A</var> = <emu-xref aoid="ArrayCreate">ArrayCreate</emu-xref>(<var>len</var>)。
  6. 让 <var>k</var> = 0。
  7. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>kValue</var> = <var>items</var>[<var>k</var>]。
    2. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    3. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <var>Pk</var>, <var>kValue</var>)。
    4. <var>k</var> 加 1。
  8. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>len</var>, <emu-val>true</emu-val>)。
  9. 返回 <var>A</var>。

</emu-alg><emu-note>注释 1

假设<var>items</var>参数是一个有序的其余参数值。

</emu-note><emu-note>注释 2

of函数是一个特有的通用的工厂方法; 它不要求<emu-val>this</emu-val>的值是一个数组构造函数。 因此它可以被其他任何构造函数通过以单个数字参数调用来转变或者继承。

</emu-note></emu-clause><emu-clause id="sec-array.prototype">

22.1.2.4 Array.prototype#

Array.prototype的值是<emu-xref href="#sec-properties-of-the-array-prototype-object">%ArrayPrototype%</emu-xref>——固有数组原型对象。

这个属性有以下特性 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

</emu-clause><emu-clause id="sec-get-array-@@species">

22.1.2.5get Array [ @@species ]#

Array[@@species]是一个可访问属性,它的赋值属性方法是<emu-val>undefined</emu-val>。 它的访问属性方法步骤如下:

<emu-alg>

  1. 返回 <emu-val>this</emu-val>。

</emu-alg>

这个方法的 name 属性是 "get [Symbol.species]"

<emu-note>注释

正常来说数组原型对象方法会使用 this 对象的构造函数去创建派生对象。但是,子类构造函数可以通过重定义@@species属性来覆盖这个默认行为。

</emu-note></emu-clause></emu-clause><emu-clause id="sec-properties-of-the-array-prototype-object">

22.1.3Array的Prototype对象的属性#

Array的prototype对象是固有对象<dfn>%ArrayPrototype%</dfn>。 Array的prototype是Array的内部对象, 并且为每个对象声明了内部方法。它有一个初始值为0的 length 属性, 它的特性是 { [[Writable]]: <emu-val>true</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

Array的prototype对象内部的[[Prototype]]是固有对象<emu-xref href="#sec-properties-of-the-object-prototype-object">%ObjectPrototype%</emu-xref>。

<emu-note>注释

Array的prototype对象被声明为数组外来对象来保证兼容为ECMAScript 2015规范写的ECMAScript代码。

</emu-note><emu-clause id="sec-array.prototype.concat">

22.1.3.1Array.prototype.concat ( ...<var>arguments</var> )#

concat 方法用零个或多个参数调用, 它返回一个顺序包含每个参数的数组元素的数组。

以下步骤会发生:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>A</var> = <emu-xref aoid="ArraySpeciesCreate">ArraySpeciesCreate</emu-xref>(<var>O</var>, 0)。
  3. 让 <var>n</var> = 0。
  4. 让 <var>items</var> 等于一个 <emu-xref href="#sec-list-and-record-specification-type">List</emu-xref>, 这个List的第一个元素是 <var>O</var>, 其余的元素是从左到右排列的传给函数调用的参数。
  5. 重复, 当 <var>items</var> 不为空
    1. 移除 <var>items</var> 的第一个元素并且让 <var>E</var> 等于移除的这个元素。
    2. 让 <var>spreadable</var> = <emu-xref aoid="IsConcatSpreadable">IsConcatSpreadable</emu-xref>(<var>E</var>)。
    3. 如果 <var>spreadable</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>k</var> = 0。
      2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>E</var>, "length"))。
      3. 如果 <var>n</var> + <var>len</var> > 253-1, 抛出<emu-val>TypeError</emu-val>异常。
      4. 重复, 当 <var>k</var> < <var>len</var>
        1. 让 <var>P</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
        2. 让 <var>exists</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>E</var>, <var>P</var>)。
        3. 如果 <var>exists</var> 等于 <emu-val>true</emu-val>, 那么
          1. 让 <var>subElement</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>E</var>, <var>P</var>)。
          2. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>n</var>), <var>subElement</var>)。
        4. <var>n</var> 加 1。
        5. <var>k</var> 加 1。
    4. 否则 <var>E</var> 作为单项目添加而不展开,
      1. 如果 <var>n</var>≥253-1, 抛出<emu-val>TypeError</emu-val>异常。
      2. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>n</var>), <var>E</var>)。
      3. <var>n</var> 加 1。
  6. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>n</var>, <emu-val>true</emu-val>)。
  7. 返回 <var>A</var>。

</emu-alg>

concat 方法的 length 属性值是1。

<emu-note>注释 1

在第6步中对 length 属性的明确的设置是有必要的,为了保证结果数组的随之而来的元素没有出现的情况下它的值是正确的。

</emu-note><emu-note>注释 2

concat 函数是一个特有的通用的工厂方法; 它不要求<emu-val>this</emu-val>的值是一个数组构造函数。 因此它可以被其他任何构造函数通过以单个数字参数调用来转变或者继承。

</emu-note><emu-clause id="sec-isconcatspreadable" aoid="IsConcatSpreadable">

22.1.3.1.1 执行期语义: IsConcatSpreadable ( <var>O</var> )#

抽象操作 IsConcatSpreadable 以 <var>O</var> 为参数调用时步骤如下:

<emu-alg>

  1. 如果<var>O</var>的 <emu-xref aoid="Type">类型</emu-xref>不是对象, 返回 <emu-val>false</emu-val>。
  2. 让 <var>spreadable</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, @@isConcatSpreadable)。
  3. 如果 <var>spreadable</var> 等于 not <emu-val>undefined</emu-val>, 返回 <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(<var>spreadable</var>)。
  4. 返回 <emu-xref aoid="IsArray">IsArray</emu-xref>(<var>O</var>)。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-array.prototype.constructor">

22.1.3.2Array.prototype.constructor#

Array.prototype.constructor 的初始值是固有对象<emu-xref href="#sec-array-constructor">%Array%</emu-xref>。

</emu-clause><emu-clause id="sec-array.prototype.copywithin">

22.1.3.3Array.prototype.copyWithin (<var>target</var>, <var>start</var> [ , <var>end</var> ] )#

copyWithin 方法有三个参数 <var>target</var>, <var>start</var> 和 <var>end</var>。

<emu-note>注释 1

<var>end</var> 参数是一个可选的作为默认值的<emu-val>this</emu-val>对象的长度。如果 <var>target</var> 为负, 它被看作是 <emu-eqn><var>length</var>+<var>target</var></emu-eqn>, <var>length</var> 是数组的长度。 如果 <var>start</var> 为负, 它被看作是<emu-eqn><var>length</var>+<var>start</var></emu-eqn>。 如果 <var>end</var> 为负, 它被看作是 <emu-eqn><var>length</var>+<var>end</var></emu-eqn>。

</emu-note>

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>relativeTarget</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>target</var>)。
  4. 如果 <var>relativeTarget</var> < 0, 让 <var>to</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeTarget</var>), 0); 否则 让 <var>to</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeTarget</var>, <var>len</var>)。
  5. 让 <var>relativeStart</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>start</var>)。
  6. 如果 <var>relativeStart</var> < 0, 让 <var>from</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeStart</var>), 0); 否则 让 <var>from</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeStart</var>, <var>len</var>)。
  7. 如果 <var>end</var> 等于 <emu-val>undefined</emu-val>, 让 <var>relativeEnd</var> = <var>len</var>; 否则 让 <var>relativeEnd</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>end</var>)。
  8. 如果 <var>relativeEnd</var> < 0, 让 <var>final</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeEnd</var>), 0); 否则 让 <var>final</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeEnd</var>, <var>len</var>)。
  9. 让 <var>count</var> = <emu-xref aoid="min">min</emu-xref>(<var>final</var>-<var>from</var>, <var>len</var>-<var>to</var>)。
  10. 如果 <var>from</var><<var>to</var> and <var>to</var><<var>from</var>+<var>count</var>, 那么
    1. 让 <var>direction</var> = -1。
    2. 让 <var>from</var> = <var>from</var> + <var>count</var> - 1。
    3. 让 <var>to</var> = <var>to</var> + <var>count</var> - 1。
  11. 否则,
    1. 让 <var>direction</var> = 1。
  12. 重复, 当 <var>count</var> > 0
    1. 让 <var>fromKey</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>from</var>)。
    2. 让 <var>toKey</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>to</var>)。
    3. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>fromKey</var>)。
    4. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>fromVal</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>fromKey</var>)。
      2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>toKey</var>, <var>fromVal</var>, <emu-val>true</emu-val>)。
    5. 否则 <var>fromPresent</var> 等于 <emu-val>false</emu-val>,
      1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>toKey</var>)。
    6. 让 <var>from</var> = <var>from</var> + <var>direction</var>。
    7. 让 <var>to</var> = <var>to</var> + <var>direction</var>。
    8. 让 <var>count</var> = <var>count</var> - 1。
  13. 返回 <var>O</var>。

</emu-alg><emu-note>注释 2

copyWithin 函数是一个特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组构造函数。 因此它可以被其他任何构造函数通过以单个数字参数调用来转变或者继承。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.entries">

22.1.3.4Array.prototype.entries ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "key+value")。

</emu-alg></emu-clause><emu-clause id="sec-array.prototype.every">

22.1.3.5Array.prototype.every ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个函数,这个函数接收三个参数返回一个变化的Boolean值(<emu-val>true</emu-val> 或者 <emu-val>false</emu-val>)。every 方法以上升的顺序展现数组中的每个元素并在展示的时候调用一次<var>callbackfn</var>方法,直到它发现其中一个元素的<var>callbackfn</var> 返回了 <emu-val>false</emu-val>。 如果这个元素被发现,every 直接返回 <emu-val>false</emu-val>。否则, 如果所有元素的 <var>callbackfn</var> 返回 <emu-val>true</emu-val>, every 将会返回 <emu-val>true</emu-val>。 <var>callbackfn</var> 仅在数组元素真实存在时调用,数组元素丢失则不会调用。

如果提供了 <var>thisArg</var> 参数, 它被用作每个 <var>callbackfn</var> 调用的 <emu-val>this</emu-val>值。如果没提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>callbackfn</var>有三个参数:元素的值, 元素的索引, 和被遍历的对象。

every 不改变调用者对象,但是对象会被 <var>callbackfn</var> 的调用改变。

every 是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 every 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 every 访问它的时候的值。在 every 调用之后访问开始和之前被删除的元素不会被访问。在数学运算中 every 表现的像 "for all"。特别的,对于空的数组,它返回 <emu-val>true</emu-val>。

</emu-note>

every 以一个或两个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var> 参数, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>k</var> = 0。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>testResult</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(<emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
      3. 如果 <var>testResult</var> 等于 <emu-val>false</emu-val>, 返回 <emu-val>false</emu-val>。
    4. <var>k</var> 加 1。
  7. 返回 <emu-val>true</emu-val>。

</emu-alg><emu-note>注释 2

every 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.fill">

22.1.3.6Array.prototype.fill (<var>value</var> [ , <var>start</var> [ , <var>end</var> ] ] )#

fill 有三个参数 <var>value</var>, <var>start</var> and <var>end</var>。

<emu-note>注释 1

<var>start</var> 和 <var>end</var> 参数是可选的并且有默认值是0和 <emu-val>this</emu-val> 对象的长度。如果 <var>start</var> 为负, 它被看作是<emu-eqn><var>length</var>+<var>start</var></emu-eqn>,<var>length</var>表示的是数组的长度。如果 <var>end</var> 为负,它被看作是 <emu-eqn><var>length</var>+<var>end</var></emu-eqn>。

</emu-note>

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>relativeStart</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>start</var>)。
  4. 如果 <var>relativeStart</var> < 0, 让 <var>k</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeStart</var>), 0); 否则 让 <var>k</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeStart</var>, <var>len</var>)。
  5. 如果 <var>end</var> 等于 <emu-val>undefined</emu-val>, 让 <var>relativeEnd</var> = <var>len</var>; 否则 让 <var>relativeEnd</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>end</var>)。
  6. 如果 <var>relativeEnd</var> < 0, 让 <var>final</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeEnd</var>), 0); 否则 让 <var>final</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeEnd</var>, <var>len</var>)。
  7. 重复, 当 <var>k</var> < <var>final</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>Pk</var>, <var>value</var>, <emu-val>true</emu-val>)。
    3. <var>k</var> 加 1。
  8. 返回 <var>O</var>。

</emu-alg><emu-note>注释 2

fill 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.filter">

22.1.3.7Array.prototype.filter ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个函数,这个函数接收3个参数返回一个变化的Boolean值(<emu-val>true</emu-val> 或者 <emu-val>false</emu-val>)。filter 以上升的顺序遍历数组中的每个元素,为每个元素调用一次 <var>callbackfn</var>,并且创建一个新的数组存放每个 <var>callbackfn</var> 返回 <emu-val>true</emu-val>的元素的值。<var>callbackfn</var> 只在元素真实存在的时候调用;不会在数组元素丢失时调用。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>callbackfn</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>callbackfn</var> 有三个参数: 元素的值, 元素的索引, 被遍历的对象。

filter 不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

filter是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 filter 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 filter 访问它的时候的值。在 filter 调用之后访问开始和之前被删除的元素不会被访问。

</emu-note>

filter 方法以一个或两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var> 参数, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>A</var> = <emu-xref aoid="ArraySpeciesCreate">ArraySpeciesCreate</emu-xref>(<var>O</var>, 0)。
  6. 让 <var>k</var> = 0。
  7. 让 <var>to</var> = 0。
  8. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>selected</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(? <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
      3. 如果 <var>selected</var> 等于 <emu-val>true</emu-val>, 那么
        1. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>to</var>), <var>kValue</var>)。
        2. <var>to</var> 加 1。
    4. <var>k</var> 加 1。
  9. 返回 <var>A</var>。

</emu-alg><emu-note>注释 2

filter 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.find">

22.1.3.8Array.prototype.find ( <var>predicate</var> [ , <var>thisArg</var> ] )#

find 方法以一个或两个参数调用, <var>predicate</var> and <var>thisArg</var>。

<emu-note>注释 1

<var>predicate</var> 应该是一个函数,这个函数接收3个参数返回一个变化的Boolean值(<emu-val>true</emu-val> 或者 <emu-val>false</emu-val>)。 find 以上升的顺序遍历数组中的每个元素,为每个元素调用一次 <var>predicate</var>,知道它发现某个元素的 <var>predicate</var> 返回了 <emu-val>true</emu-val>。这个元素找到了, find 直接返回这个元素的值。否则,返回 <emu-val>undefined</emu-val>。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>predicate</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>predicate</var> 有三个参数: 元素的值, 元素的索引, 被遍历的对像。

find 不直接改变调用的对象,但是对象可能被 <var>predicate</var> 的调用改变。

find是在第一次调用 <var>predicate</var> 的时候处理元素的范围。在调用 find 后再被添加到数组里的元素是不会被 <var>predicate</var> 访问。如果已经存在的元素被改变,传递给 <var>predicate</var> 的值是时 filter 访问它的时候的值。在 filter 调用之后访问开始和之前被删除的元素不会被访问。

</emu-note>

find 方法调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>predicate</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果 <var>thisArg</var> was supplied, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>k</var> = 0。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 让 <var>testResult</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(? <emu-xref aoid="Call">Call</emu-xref>(<var>predicate</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
    4. 如果 <var>testResult</var> 等于 <emu-val>true</emu-val>, 返回 <var>kValue</var>。
    5. <var>k</var> 加 1。
  7. 返回 <emu-val>undefined</emu-val>。

</emu-alg><emu-note>注释 2

find 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.findindex">

22.1.3.9Array.prototype.findIndex ( <var>predicate</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>predicate</var> 应该是一个函数,这个函数接收3个参数返回一个变化的Boolean值(<emu-val>true</emu-val> 或者 <emu-val>false</emu-val>)。findIndex 以上升的顺序遍历数组中的每个元素,为每个元素调用一次 <var>predicate</var>, 直到找到某个元素的 <var>predicate</var> 返回 <emu-val>true</emu-val>。 如果这个元素被找到, findIndex 直接返回元素的索引。否则, findIndex 返回 -1。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>predicate</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>predicate</var> 有三个参数: 元素的值,元素的索引,被遍历的对象。

findIndex 不直接改变调用的对象,但是对象可能被 <var>predicate</var> 的调用改变。

findIndex 是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 findIndex 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>predicate</var> 的值是时 findIndex 访问它的时候的值。

</emu-note>

findIndex 方法以一个或两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(? <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>predicate</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>k</var> = 0。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 让 <var>testResult</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(<emu-xref aoid="Call">Call</emu-xref>(<var>predicate</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
    4. 如果 <var>testResult</var> 等于 <emu-val>true</emu-val>, 返回 <var>k</var>。
    5. <var>k</var> 加 1。
  7. 返回 -1。

</emu-alg><emu-note>注释 2

findIndex 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.foreach">

22.1.3.10Array.prototype.forEach ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个接收三个参数的函数。forEach 以上升的顺序遍历数组中的每个元素,为每个元素调用一次 <var>callbackfn</var>。<var>callbackfn</var> 仅在数组元素真实存在时调用,数组元素丢失时不调用。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>callbackfn</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>callbackfn</var>有三个参数:元素的值,元素的索引,和被遍历的对象。

forEach 不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

</emu-note>

forEach 方法以一个或两个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>k</var> = 0。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 执行 <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »)。
    4. <var>k</var> 加 1。
  7. 返回 <emu-val>undefined</emu-val>。

</emu-alg><emu-note>注释 2

forEach 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.includes">

22.1.3.11Array.prototype.includes ( <var>searchElement</var> [ , <var>fromIndex</var> ] )#

<emu-note>注释 1

includes以上升的顺序遍历数组中的每个元素 使用 <emu-xref aoid="SameValueZero">SameValueZero</emu-xref> 算法和 <var>searchElement</var>比较,如果找到了某个位置相同, 返回 <emu-val>true</emu-val>; 否则,返回 <emu-val>false</emu-val>。

可选的第二个参数 <var>fromIndex</var> 默认值为0 (表示整个数组都会被查找)。如果它大于或等于数组的长度,返回<emu-val>false</emu-val>, 数组也不会被查找。如果为负,它被用作数组最后一个元素偏移 <var>fromIndex</var>。 如果计算所以小于0,整个数组会被查找。

</emu-note>

includes 调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>len</var> 等于 0, 返回 <emu-val>false</emu-val>。
  4. 让 <var>n</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>fromIndex</var>). (如果 <var>fromIndex</var> 等于 <emu-val>undefined</emu-val>,这一步产生的值为0。)
  5. 如果 <var>n</var> ≥ 0, 那么
    1. 让 <var>k</var> = <var>n</var>。
  6. 否则 <var>n</var> < 0,
    1. 让 <var>k</var> = <var>len</var> + <var>n</var>。
    2. 如果 <var>k</var> < 0, 让 <var>k</var> = 0。
  7. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>elementK</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
    2. 如果 <emu-xref aoid="SameValueZero">SameValueZero</emu-xref>(<var>searchElement</var>, <var>elementK</var>) is <emu-val>true</emu-val>, 返回 <emu-val>true</emu-val>。
    3. <var>k</var> 加 1。
  8. 返回 <emu-val>false</emu-val>。

</emu-alg><emu-note>注释 2

includes 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note><emu-note>注释 3

includes 方法有意分日从两方面来区别于 indexOf 方法。首先,它使用 <emu-xref aoid="SameValueZero">SameValueZero</emu-xref> 算法来代替 <emu-xref aoid="Strict Equality Comparison">Strict Equality Comparison</emu-xref>, 以至于可以发现为 <emu-val>NaN</emu-val> 的数组元素。其次, 它不忽略丢失的数组元素,而是把它们看做 <emu-val>undefined</emu-val>。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.indexof">

22.1.3.12Array.prototype.indexOf ( <var>searchElement</var> [ , <var>fromIndex</var> ] )#

<emu-note>注释 1

indexOf 上升的顺序遍历数组中的每个元素使用<emu-xref aoid="Strict Equality Comparison">Strict Equality Comparison</emu-xref>算法和 <var>searchElement</var> 对比,如果找到一个或者多个,返回最小的索引;否则返回 -1。

可选的第二个参数 <var>fromIndex</var> 默认值为0 (表示整个数组都会被查找)。如果它大于或等于数组的长度,返回 -1, 数组也不会被查找。如果为负,它被用作数组最后一个元素偏移 <var>fromIndex</var>。 如果计算所以小于0,整个数组会被查找。

</emu-note>

indexOf 方法以一个或两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>len</var> 等于 0, 返回 -1。
  4. 让 <var>n</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>fromIndex</var>). (如果 <var>fromIndex</var> 等于 <emu-val>undefined</emu-val>, 这一步结果为0)
  5. 如果 <var>n</var> ≥ <var>len</var>, 返回 -1。
  6. 如果 <var>n</var> ≥ 0, 那么
    1. 如果 <var>n</var> 等于 <emu-val>-0</emu-val>, 让 <var>k</var> = <emu-val>+0</emu-val>; 否则 让 <var>k</var> = <var>n</var>。
  7. 否则 <var>n</var> < 0,
    1. 让 <var>k</var> = <var>len</var> + <var>n</var>。
    2. 如果 <var>k</var> < 0, 让 <var>k</var> = 0。
  8. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
    2. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>elementK</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
      2. 让 <var>same</var> = <emu-xref aoid="Strict Equality Comparison">(Strict Equality Comparison)</emu-xref> <var>searchElement</var> === <var>elementK</var>。
      3. 如果 <var>same</var> 等于 <emu-val>true</emu-val>, 返回 <var>k</var>。
    3. <var>k</var> 加 1。
  9. 返回 -1。

</emu-alg><emu-note>注释 2

indexOf 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.join">

22.1.3.13Array.prototype.join (<var>separator</var>)#

<emu-note>注释 1

把数组元素转变成字符串,The elements of the array are converted to Strings,把这些字符串连起来并且用 <var>separator</var> 分隔。如果没有提供 <var>separator</var>,一个逗号会作为分隔符。

</emu-note>

join 方法有一个参数, <var>separator</var>, 步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>separator</var> 等于 <emu-val>undefined</emu-val>, 让 <var>separator</var> = ","
  4. 让 <var>sep</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>separator</var>)。
  5. 如果 <var>len</var> 等于 zero, 返回空字符串。
  6. 让 <var>element0</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "0")。
  7. 如果 <var>element0</var> 等于 <emu-val>undefined</emu-val> 或者 <emu-val>null</emu-val>, 让 <var>R</var> 等于空字符串; 否则, 让 <var>R</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>element0</var>)。
  8. 让 <var>k</var> = 1
  9. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>S</var> 等于<var>R</var> 和<var>sep</var> 连接后得到的字符串。
    2. 让 <var>element</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
    3. 如果 <var>element</var> 等于 <emu-val>undefined</emu-val> 或者 <emu-val>null</emu-val>, 让 <var>next</var> 等于空字符串; 否则, 让 <var>next</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>element</var>)。
    4. 让 <var>R</var>等于 <var>S</var> 和 <var>next</var> 连接后的字符串。
    5. <var>k</var> 加 1。
  10. 返回 <var>R</var>。

</emu-alg><emu-note>注释 2

join 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.keys">

22.1.3.14Array.prototype.keys ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "key")。

</emu-alg></emu-clause><emu-clause id="sec-array.prototype.lastindexof">

22.1.3.15Array.prototype.lastIndexOf ( <var>searchElement</var> [ , <var>fromIndex</var> ] )#

<emu-note>注释 1

lastIndexOf 以下降的方式遍历数组元素用 <emu-xref aoid="Strict Equality Comparison">Strict Equality Comparison</emu-xref> 算法和 <var>searchElement</var> 比较,如果找到一个或多个相同的,返回找到的最大的索引;否则,返回 -1。

可选的第二个参数 <var>fromIndex</var> 默认值为数组长度减一(表示查找整个数组)。如果它大于或等于数组长度,会查找整个数组。如果为负 If it is greater than or equal to the length of the array, the whole array will be searched. If it is negative,它被用作从数组的末尾到计算 <var>fromIndex</var> 的偏移量。如果计算索引小于0,返回 -1。

</emu-note>

lastIndexOf 方法以一个或两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>len</var> 等于 0, 返回 -1。
  4. 如果传递了 <var>fromIndex</var> 参数, 让 <var>n</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>fromIndex</var>); 否则 让 <var>n</var> = <var>len</var>-1。
  5. 如果 <var>n</var> ≥ 0, 那么
    1. 如果 <var>n</var> 等于 <emu-val>-0</emu-val>, 让 <var>k</var> = <emu-val>+0</emu-val>; 否则 让 <var>k</var> = <emu-xref aoid="min">min</emu-xref>(<var>n</var>, <var>len</var> - 1)。
  6. 否则 <var>n</var> < 0,
    1. 让 <var>k</var> = <var>len</var> + <var>n</var>。
  7. 重复, 当 <var>k</var> ≥ 0
    1. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
    2. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>elementK</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
      2. 让 <var>same</var> = <emu-xref aoid="Strict Equality Comparison">(Strict Equality Comparison)</emu-xref> <var>searchElement</var> === <var>elementK</var>。
      3. 如果 <var>same</var> 等于 <emu-val>true</emu-val>, 返回 <var>k</var>。
    3. Decrease <var>k</var> 加 1。
  8. 返回 -1。

</emu-alg><emu-note>注释 2

lastIndexOf 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.map">

22.1.3.16Array.prototype.map ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个接收三个参数的函数。 map 以上升的顺序遍历数组中的每个元素,每个元素调用一次 <var>callbackfn</var> 并且从结果构建一个新数组。<var>callbackfn</var> 只在数组元素真实存在的时候调用; 数组元素丢失则不会调用。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>callbackfn</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>callbackfn</var> 有三个参数:元素的值,元素的索引,和被遍历的对象。

map 不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

map 是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 map 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 map 访问它的时候的值。在 map 调用之后访问开始和之前被删除的元素不会被访问。

</emu-note>

map 方法以一个或两个两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var> , 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>A</var> = <emu-xref aoid="ArraySpeciesCreate">ArraySpeciesCreate</emu-xref>(<var>O</var>, <var>len</var>)。
  6. 让 <var>k</var> = 0。
  7. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>mappedValue</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »)。
      3. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <var>Pk</var>, <var>mappedValue</var>)。
    4. <var>k</var> 加 1。
  8. 返回 <var>A</var>。

</emu-alg><emu-note>注释 2

map 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.pop">

22.1.3.17Array.prototype.pop ( )#

<emu-note>注释 1

移除数组的最后一个元素并且返回移除的这个元素。

</emu-note>

pop 方法调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>len</var> 等于 zero, 那么
    1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", 0, <emu-val>true</emu-val>)。
    2. 返回 <emu-val>undefined</emu-val>。
  4. 否则 <var>len</var> > 0,
    1. 让 <var>newLen</var> = <var>len</var>-1。
    2. 让 <var>indx</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>newLen</var>)。
    3. 让 <var>element</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>indx</var>)。
    4. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>indx</var>)。
    5. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", <var>newLen</var>, <emu-val>true</emu-val>)。
    6. 返回 <var>element</var>。

</emu-alg><emu-note>注释 2

pop 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.push">

22.1.3.18Array.prototype.push ( ...<var>items</var> )#

<emu-note>注释 1

把参数出现的顺序追加到数组的最后。数组的新长度作为函数调用的结果返回。

</emu-note>

push 方法以0个或多个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>items</var> 等于一个 <emu-xref href="#sec-list-and-record-specification-type">List</emu-xref>,它的元素是函数调用时传递的参数从左到右排列。
  4. 让 <var>argCount</var> 等于 <var>items</var> 元素的个数。
  5. 如果 <var>len</var> + <var>argCount</var> > 253-1, 抛出<emu-val>TypeError</emu-val>异常。
  6. 重复, 当 <var>items</var> 不为空
    1. 移除 <var>items</var> 的第一个元素并且 <var>E</var> 等于移除的这个元素。
    2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>len</var>), <var>E</var>, <emu-val>true</emu-val>)。
    3. 让 <var>len</var> = <var>len</var>+1。
  7. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", <var>len</var>, <emu-val>true</emu-val>)。
  8. 返回 <var>len</var>。

</emu-alg>

push 方法的 length 属性为 1。

<emu-note>注释 2

push 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.reduce">

22.1.3.19Array.prototype.reduce ( <var>callbackfn</var> [ , <var>initialValue</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个接收4个参数的函数。reduce 以上升的顺序遍历数组中的每个元素并且调用回调函数。

<var>callbackfn</var> 有4个参数: <var>previousValue</var> (上一次调用 <var>callbackfn</var> 返回的值), <var>currentValue</var> (当前元素的值), the <var>currentIndex</var>, 和被遍历的数组。 第一次调用回调的时候, <var>previousValue</var> 和 <var>currentValue</var> 的值有两种情况。如果调用 reduce 时提供了一个 <var>initialValue</var>, 那么 <var>previousValue</var> 等于 <var>initialValue</var>, <var>currentValue</var> 等于数组的第一个元素。如果没有提供 <var>initialValue</var>, 那么 <var>previousValue</var> 等于数组的第一个元素, <var>currentValue</var>等于第二个元素。如果数组没有元素也没有提供 <var>initialValue</var> 会抛出 <emu-val>TypeError</emu-val> 异常。

reduce 不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

reduce是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 reduce 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 reduce 访问它的时候的值。在 reduce 调用之后访问开始和之前被删除的元素不会被访问。

</emu-note>

reduce 方法以一个或两个参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果 <var>len</var> 等于 0 并且没有 <var>initialValue</var>, 抛出<emu-val>TypeError</emu-val>异常。
  5. 让 <var>k</var> = 0。
  6. 如果出现 <var>initialValue</var>, 那么
    1. 让 <var>accumulator</var> = <var>initialValue</var>。
  7. 否则没有 <var>initialValue</var>,
    1. 让 <var>kPresent</var> = <emu-val>false</emu-val>。
    2. 重复, 当 <var>kPresent</var> 等于 <emu-val>false</emu-val> 并且 <var>k</var> < <var>len</var>
      1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
      2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
      3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>accumulator</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      4. <var>k</var> 加 1。
    3. 如果 <var>kPresent</var> 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  8. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>accumulator</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <emu-val>undefined</emu-val>, « <var>accumulator</var>, <var>kValue</var>, <var>k</var>, <var>O</var> »)。
    4. <var>k</var> 加 1。
  9. 返回 <var>accumulator</var>。

</emu-alg><emu-note>注释 2

reduce 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.reduceright">

22.1.3.20Array.prototype.reduceRight ( <var>callbackfn</var> [ , <var>initialValue</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是接收4个参数的函数reduceRight 以降序遍历数组的每个元素并调用回调函数。

<var>callbackfn</var> 有四个参数: <var>previousValue</var> (上一次调用 <var>callbackfn</var> 的值), <var>currentValue</var> (当前元素的值), the <var>currentIndex</var>,和被遍历的元素。函数第一次调用时,<var>previousValue</var> 和 <var>currentValue</var>有两种情况。如果调用 reduceRight 时提供了 <var>initialValue</var> , 那么 <var>previousValue</var> 等于 <var>initialValue</var>, <var>currentValue</var> 等于数组的最后一个元素。如果没有提供 <var>initialValue</var>, 那么 <var>previousValue</var> 等于数组的最后一个元素,<var>currentValue</var> 等于倒数第二个。如果数组没有元素也没有提供 <var>initialValue</var> 会抛出 <emu-val>TypeError</emu-val> 异常。

reduceRight 不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

reduceRight是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 reduceRight 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 reduceRight 访问它的时候的值。在 reduceRight 调用之后访问开始和之前被删除的元素不会被访问。 </emu-note>

reduceRight 方法以一个或两个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果 <var>len</var> 等于 0 并且没有 <var>initialValue</var>, 抛出<emu-val>TypeError</emu-val>异常。
  5. 让 <var>k</var> = <var>len</var>-1。
  6. 如果出现了 <var>initialValue</var>, 那么
    1. 让 <var>accumulator</var> = <var>initialValue</var>。
  7. 否则没有出现 <var>initialValue</var>,
    1. 让 <var>kPresent</var> = <emu-val>false</emu-val>。
    2. 重复, 当 <var>kPresent</var> 等于 <emu-val>false</emu-val> 并且 <var>k</var> ≥ 0
      1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
      2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
      3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>accumulator</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      4. <var>k</var> 减 1。
    3. 如果 <var>kPresent</var> 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  8. 重复, 当 <var>k</var> ≥ 0
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>accumulator</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <emu-val>undefined</emu-val>, « <var>accumulator</var>, <var>kValue</var>, <var>k</var>, <var>O</var> »)。
    4. <var>k</var> 减 1。
  9. 返回 <var>accumulator</var>。

</emu-alg><emu-note>注释 2

reduceRight 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.reverse">

22.1.3.21Array.prototype.reverse ( )#

<emu-note>注释 1

数组元素按倒序重新排列, 对象作为函数调用的结果返回。

</emu-note>

reverse 方法调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>middle</var> = <emu-xref aoid="floor">floor</emu-xref>(<var>len</var>/2)。
  4. 让 <var>lower</var> = 0。
  5. 重复, 当 <var>lower</var> ≠ <var>middle</var>
    1. 让 <var>upper</var> = <var>len</var> - <var>lower</var> - 1。
    2. 让 <var>upperP</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>upper</var>)。
    3. 让 <var>lowerP</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>lower</var>)。
    4. 让 <var>lowerExists</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>lowerP</var>)。
    5. 如果 <var>lowerExists</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>lowerValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>lowerP</var>)。
    6. 让 <var>upperExists</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>upperP</var>)。
    7. 如果 <var>upperExists</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>upperValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>upperP</var>)。
    8. 如果 <var>lowerExists</var> 等于 <emu-val>true</emu-val> 并且 <var>upperExists</var> 等于 <emu-val>true</emu-val>, 那么
      1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>lowerP</var>, <var>upperValue</var>, <emu-val>true</emu-val>)。
      2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>upperP</var>, <var>lowerValue</var>, <emu-val>true</emu-val>)。
    9. 否则,如果 <var>lowerExists</var> 等于 <emu-val>false</emu-val> 并且 <var>upperExists</var> 等于 <emu-val>true</emu-val>, 那么
      1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>lowerP</var>, <var>upperValue</var>, <emu-val>true</emu-val>)。
      2. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>upperP</var>)。
    10. 否则,如果 <var>lowerExists</var> 等于 <emu-val>true</emu-val> 并且 <var>upperExists</var> 等于 <emu-val>false</emu-val>, 那么
      1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>lowerP</var>)。
      2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>upperP</var>, <var>lowerValue</var>, <emu-val>true</emu-val>)。
    11. 否则,如果<var>lowerExists</var> 和 <var>upperExists</var> 同为 <emu-val>false</emu-val>,
      1. 不需要任何操作。
    12. <var>lower</var> 加 1。
  6. 返回 <var>O</var>。

</emu-alg><emu-note>注释 2

reverse 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.shift">

22.1.3.22Array.prototype.shift ( )#

<emu-note>注释 1

移除数组的第一个元素并且返回移除的这个元素。

</emu-note>

shift 方法调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <var>len</var> 等于 zero, 那么
    1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", 0, <emu-val>true</emu-val>)。
    2. 返回 <emu-val>undefined</emu-val>。
  4. 让 <var>first</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "0")。
  5. 让 <var>k</var> = 1。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>from</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>to</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>-1)。
    3. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>from</var>)。
    4. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>fromVal</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>from</var>)。
      2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>to</var>, <var>fromVal</var>, <emu-val>true</emu-val>)。
    5. 否则 <var>fromPresent</var> 等于 <emu-val>false</emu-val>,
      1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>to</var>)。
    6. <var>k</var> 加 1。
  7. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>len</var>-1))。
  8. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", <var>len</var>-1, <emu-val>true</emu-val>)。
  9. 返回 <var>first</var>。

</emu-alg><emu-note>注释 2

shift 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以转变为一个其他种类的对象来作为方法来使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.slice">

22.1.3.23Array.prototype.slice (<var>start</var>, <var>end</var>)#

<emu-note>注释 1

slice 方法有两个参数, <var>start</var> 和 <var>end</var>,并且返回一个包含从 <var>start</var> (但不包括)到 <var>end</var> (或者到数组的最后一个元素,如果 <var>end</var> 等于 <emu-val>undefined</emu-val>). 如果 <var>start</var> 为负, 它被认为是 <emu-eqn><var>length</var>(数组的长度)+<var>start</var></emu-eqn>。 如果 <var>end</var> 为负, 它被认为是 <emu-eqn><var>length</var>(数组的长度)+<var>end</var></emu-eqn>。

</emu-note>

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>( <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>relativeStart</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>start</var>)。
  4. 如果 <var>relativeStart</var> < 0, 让 <var>k</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeStart</var>), 0); 否则, 让 <var>k</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeStart</var>, <var>len</var>)。
  5. 如果 <var>end</var> 等于 <emu-val>undefined</emu-val>, 让 <var>relativeEnd</var> = <var>len</var>; 否则 让 <var>relativeEnd</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>end</var>)。
  6. 如果 <var>relativeEnd</var> < 0, 让 <var>final</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeEnd</var>), 0); 否则 让 <var>final</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeEnd</var>, <var>len</var>)。
  7. 让 <var>count</var> = <emu-xref aoid="max">max</emu-xref>(<var>final</var> - <var>k</var>, 0)。
  8. 让 <var>A</var> = <emu-xref aoid="ArraySpeciesCreate">ArraySpeciesCreate</emu-xref>(<var>O</var>, <var>count</var>)。
  9. 让 <var>n</var> = 0。
  10. 重复, 当 <var>k</var> < <var>final</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>n</var>), <var>kValue</var>)。
    4. <var>k</var> 加 1。
    5. <var>n</var> 加 1。
  11. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>n</var>, <emu-val>true</emu-val>)。
  12. 返回 <var>A</var>。

</emu-alg><emu-note>注释 2

在第11步的时候明确设置结果数组的length属性在以前的ECMAScript版本中是有必要的, 在结果数组的后面元素没有出现的情况下保证它的长度是正确的。从ES2015开始设置长度是没有必要的,结果数组是用本身的长度来初始化的而不是一个空数组,但是这是保持向后兼容性的。

</emu-note><emu-note>注释 3

slice 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.some">

22.1.3.24Array.prototype.some ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-note>注释 1

<var>callbackfn</var> 应该是一个函数,这个函数接收3个参数返回一个变化的Boolean值(<emu-val>true</emu-val> 或者 <emu-val>false</emu-val>)。 some 以上升的顺序遍历数组中的每个元素,为每个元素调用一次 <var>callbackfn</var>,直到找到某个元素的 <var>callbackfn</var> 返回了 <emu-val>true</emu-val>。如果这样的元素被找到,some 直接返回 <emu-val>true</emu-val>。否则, some 返回 <emu-val>false</emu-val>。<var>callbackfn</var> 只在元素真实存在的时候调用;不会在数组元素丢失时调用。

如果提供了 <var>thisArg</var> 参数,它会在每次 <var>callbackfn</var> 调用时被用作 <emu-val>this</emu-val> 的值。如果没有提供,就用 <emu-val>undefined</emu-val> 来代替。

<var>callbackfn</var> 有三个参数:元素的值,元素的索引,和被遍历的对象。

some不直接改变调用的对象,但是对象可能被 <var>callbackfn</var> 的调用改变。

some是在第一次调用 <var>callbackfn</var> 的时候处理元素的范围。在调用 some 后再被添加到数组里的元素是不会被 <var>callbackfn</var> 访问。如果已经存在的元素被改变,传递给 <var>callbackfn</var> 的值是时 some 访问它的时候的值。在 some 调用之后访问开始和之前被删除的元素不会被访问。some表现的像数学计算中的“存在”。特殊的,对于空数组,返回<emu-val>false</emu-val>。

</emu-note>

some 方法以一个或两个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  5. 让 <var>k</var> = 0。
  6. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 如果 <var>kPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      2. 让 <var>testResult</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(<emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
      3. 如果 <var>testResult</var> 等于 <emu-val>true</emu-val>, 返回 <emu-val>true</emu-val>。
    4. <var>k</var> 加 1。
  7. 返回 <emu-val>false</emu-val>。

</emu-alg><emu-note>注释 2

some 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.sort">

22.1.3.25Array.prototype.sort (<var>comparefn</var>)#

数组的元素会被排序。顺序不一定是稳定的(意味着,比较起来相等的元素不一定停留在最初的位置)。如果 <var>comparefn</var> 不等于 <emu-val>undefined</emu-val>, 那么它应该是一个函数,这个函数接收两个参数<var>x</var> 和 <var>y</var>,如果<var>x</var> 小于 <var>y</var> 返回一个负值, 如果 <var>x</var> 等于 <var>y</var> 返回0, 如果 <var>x</var> 大于 <var>y</var>返回一个正值。

如上发生,初始化sort函数调用值的步骤如下:

<emu-alg>

  1. 让 <var>obj</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>obj</var>, "length"))。

</emu-alg>

sort方法的详述里, 对象<var>obj</var>, 被认为是 稀疏的 如果以下算法返回 <emu-val>true</emu-val>:

<emu-alg>

  1. 对于0≤<var>i</var>< <var>len</var>范围里的每个整数<var>i</var>
    1. 让 <var>elem</var> = <var>obj</var>.[GetOwnProperty]</emu-xref>(<var>i</var> ))。
    2. 如果 <var>elem</var> 等于 <emu-val>undefined</emu-val>, 返回 <emu-val>true</emu-val>。
  2. 返回 <emu-val>false</emu-val>。

</emu-alg>

<var>obj</var>的整数索引属性值的排列顺序被固定在这个方法结束后,<var>obj</var> 的整数索引值的个数是小于 <var>len</var>的。sort 函数的结果取决于以下固定的步骤:

如果 <var>comparefn</var> 不等于 <emu-val>undefined</emu-val>,并且不是一个对于数组元素一致的比较函数(看下面),排列顺序是实现定义的。如果 <var>comparefn</var> 等于 <emu-val>undefined</emu-val>,并且<emu-xref aoid="SortCompare">SortCompare</emu-xref>不是一个一致的比较函数,排列顺序也是实现定义的。

让 <var>proto</var> = <var>obj</var>.[GetPrototypeOf]. 如果 <var>proto</var> 不等于 <emu-val>null</emu-val> 并且 存在一个整数<var>j</var>满足下面所有的条件,那么排列顺序是实现定义的:

  • <var>obj</var> 是稀疏的
  • 0 ≤ <var>j</var> < <var>len</var>
  • <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>proto</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>j</var>)) 等于 <emu-val>true</emu-val>。

如果 <var>obj</var> 是稀疏的并且满足以下条件任何一个,排列顺序是实现定义的:

  • <emu-xref aoid="IsExtensible">IsExtensible</emu-xref>(<var>obj</var>) 等于 <emu-val>false</emu-val>。
  • <var>obj</var>任何一个名字是一个小于<var>len</var>的非负整数的整数索引属性的[[Configurable]]特性是 <emu-val>false</emu-val>。

如果满足以下任何一个条件,排列顺序是实现定义的:

  • 如果 <var>obj</var> 是一个外来对象 (包括代理外来对象), 这些对象的[[Get]], [[Set]], [[Delete]] 和 [[GetOwnProperty]] 的行为不同与普通对象的这些方法的实现。
  • 如果<var>obj</var>任何一个名字是一个小于<var>len</var>的非负整数的索引属性的[[Writable]]特性是 <emu-val>false</emu-val>。
  • 如果 <var>comparefn</var> 等于 <emu-val>undefined</emu-val>,并且<emu-xref aoid="ToString">ToString</emu-xref>对于任何传递给<emu-xref aoid="SortCompare">SortCompare</emu-xref>作为参数的值的应用修改了<var>obj</var>或者任何<var>obj</var> 的属性链。
  • 如果 <var>comparefn</var> 等于 <emu-val>undefined</emu-val> 并且所有<emu-xref aoid="ToString">ToString</emu-xref>对于任何传递给<emu-xref aoid="SortCompare">SortCompare</emu-xref>作为参数的值,不产生同样的结果。

步骤如下:

<emu-alg>

  1. 执行一个与执行相关的对<var>obj</var>的内部方法[[Get]]和[[Set]]的调用顺序,对于<emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref> 和 <emu-xref aoid="HasOwnProperty">HasOwnProperty</emu-xref>抽象操作用 <var>obj</var> 作为第一个参数,对于 <emu-xref aoid="SortCompare">SortCompare</emu-xref> (描述如下),这样:
    • 属性键属性对于每次[[Get]]和[[Set]]的调用, <emu-xref aoid="HasOwnProperty">HasOwnProperty</emu-xref>, 或者 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>是一个小于<var>len</var>的非负整数的字符串表示形式。
    • 调用<emu-xref aoid="SortCompare">SortCompare</emu-xref>的参数是先前对[[Get]]内部方法的调用返回的值,除非根据<emu-xref aoid="HasOwnProperty">HasOwnProperty</emu-xref>不存在由这些先前调用访问的属性。如果<emu-xref aoid="SortCompare">SortCompare</emu-xref>的透视参数对应于不存在的属性,则使用+ 0不调用<emu-xref aoid="SortCompare">SortCompare</emu-xref>。如果只有第一个透视参数不存在,则使用+1。如果只有第二个透视参数不存在使用-1。
    • 如果 <var>obj</var> 不是稀疏的, 那么一定不能调用 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref> 方法。
    • 如果任何一个[[Set]]调用返回<emu-val>false</emu-val>,会抛出<emu-val>TypeError</emu-val>异常。
    • 如果这些操作中任何一个返回了<emu-xref href="#sec-completion-record-specification-type">abrupt completion</emu-xref>, 它会立即作为函数的返回值返回。
  2. 返回 <var>obj</var>。

</emu-alg>

除非上面指定的排序顺序为实现定义,返回对象必须具有以下两个特性:

  • 必须有非负整数的一些数学排列π比<var>len</var>少,这样,对于每一个非负整数<var>j</var>大于<var>len</var>少,如果属性<emu-eqn>old[<var>j</var>]</emu-eqn>存在, 那么<emu-eqn>new[π(<var>j</var>)]</emu-eqn>的值和<emu-eqn>old[<var>j</var>]</emu-eqn>一样。但是如果属性<emu-eqn>old[<var>j</var>]</emu-eqn>不存在, 那么 <emu-eqn>new[π(<var>j</var>)]</emu-eqn>也不存在。
  • 那么对于任何小于<var>len</var>的所有的非负整数<var>j</var>和<var>k</var>, 如果 <emu-eqn><emu-xref aoid="SortCompare">SortCompare</emu-xref>(old[<var>j</var>], old[<var>k</var>]) < 0</emu-eqn> (看<emu-xref aoid="SortCompare">SortCompare</emu-xref> =low), 那么 <emu-eqn>new[π(<var>j</var>)] < new[π(<var>k</var>)]</emu-eqn>。

这里的符号<emu-eqn>old[<var>j</var>]</emu-eqn>是用来指向一个假设的结果,这个结果是执行函数时以<var>j</var>为参数调用<var>obj</var>的内部方法[[Get]]返回的;符号<emu-eqn>new[<var>j</var>]</emu-eqn>是用来指向一个假设的结果,这个结果是执行函数后以<var>j</var>为参数调用<var>obj</var>的内部方法[[Get]]返回的。

<var>comparefn</var>是一个稳定的比较函数, 对于值集<var>S</var>, 如果以下所有的需求对于值集<var>S</var>里所有的值<var>a</var>,<var>b</var>和<var>c</var> (可能相同) 都满足: 符号<emu-eqn><var>a</var><CF<var>b</var></emu-eqn>意味着<emu-eqn><var>comparefn</var>(<var>a</var>, <var>b</var>) < 0</emu-eqn>;<emu-eqn><var>a</var>等于CF<var>b</var></emu-eqn>意味着<emu-eqn><var>comparefn</var>(<var>a</var>, <var>b</var>)等于0</emu-eqn> (无论是标志); <emu-eqn><var>a</var>>CF<var>b</var></emu-eqn>意味着<emu-eqn><var>comparefn</var>(<var>a</var>, <var>b</var>) > 0</emu-eqn>。

  • 如果给定明确的一对值<var>a</var>和<var>b</var>作为参数调用<var>comparefn</var>(<var>a</var>, <var>b</var>)始终返回同样的值<var>v</var>。此外, <emu-xref aoid="Type">Type</emu-xref>(<var>v</var>)是Number类型, 并且<var>v</var>不是<emu-val>NaN</emu-val>。这样就能确切的知道给定的<var>a</var>和<var>b</var>是<var>a</var> <CF <var>b</var>, <var>a</var> =CF <var>b</var>或<var>a</var> >CF <var>b</var>中的哪一种。
  • 调用<var>comparefn</var>(<var>a</var>, <var>b</var>)不会修改<var>obj</var>的属性或者任何<var>obj</var>原型链上的对象。
  • <var>a</var> =CF<var>a</var> (取反)
  • 如果 <var>a</var>等于CF <var>b</var>, 那么 <var>b</var> =CF <var>a</var> (对称)
  • 如果 <var>a</var>等于CF <var>b</var>并且<var>b</var>等于CF <var>c</var>, 那么 <var>a</var> =CF <var>c</var> (传递 =CF)
  • 如果 <var>a</var> <CF <var>b</var>并且<var>b</var> <CF <var>c</var>, 那么 <var>a</var> <CF <var>c</var> (传递<CF)
  • 如果 <var>a</var> >CF <var>b</var>并且<var>b</var> >CF <var>c</var>, 那么 <var>a</var> >CF <var>c</var> (传递 >CF)

<emu-note>注释 1

以上是确定<var>comparefn</var>去划分值集<var>S</var>为等价类并且等价类是全序的充分必要条件。

</emu-note><emu-note>注释 2

sort函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note><emu-clause id="sec-sortcompare" aoid="SortCompare">

22.1.3.25.1执行期语意学: SortCompare( <var>x</var>, <var>y</var> )#

SortCompare是一个抽象操作,以<var>x</var>和<var>y</var>两个参数调用。它也有获取sort方法传给当前<var>comparefn</var>调用的参数的权限。步骤如下:

<emu-alg>

  1. 如果 <var>x</var>和<var>y</var>都为<emu-val>undefined</emu-val>, 返回 <emu-val>+0</emu-val>。
  2. 如果 <var>x</var> 等于 <emu-val>undefined</emu-val>, 返回 1。
  3. 如果 <var>y</var> 等于 <emu-val>undefined</emu-val>, 返回 -1。
  4. 如果参数<var>comparefn</var>不为<emu-val>undefined</emu-val>, 那么
    1. 让 <var>v</var> = <emu-xref aoid="ToNumber">ToNumber</emu-xref>(<emu-xref aoid="Call">Call</emu-xref>(<var>comparefn</var>, <emu-val>undefined</emu-val>, « <var>x</var>, <var>y</var> »))。
    2. 如果 <var>v</var> 等于 <emu-val>NaN</emu-val>, 返回 <emu-val>+0</emu-val>。
    3. 返回 <var>v</var>。
  5. 让 <var>xString</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>x</var>)。
  6. 让 <var>yString</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>y</var>)。
  7. 让 <var>xSmaller</var>等于执行<emu-xref aoid="Abstract Relational Comparison">摘要关系比较</emu-xref> <var>xString</var> < <var>yString</var>的结果。
  8. 如果 <var>xSmaller</var> 等于 <emu-val>true</emu-val>, 返回 -1。
  9. 让 <var>ySmaller</var> 等于执行<emu-xref aoid="Abstract Relational Comparison">摘要关系比较</emu-xref> <var>yString</var> < <var>xString</var>的结果。
  10. 如果 <var>ySmaller</var> 等于 <emu-val>true</emu-val>, 返回 1。
  11. 返回 <emu-val>+0</emu-val>。

</emu-alg><emu-note>注释 1

因为不存在的属性值总是大于为<emu-val>undefined</emu-val>的属性值,<emu-val>undefined</emu-val>总是大于其他值,<emu-val>undefined</emu-val>总是在结果的末尾,然后是不存在的属性值。

</emu-note><emu-note>注释 2

方法执行到第5和7步的抽象操作<emu-xref aoid="ToString">ToString</emu-xref>,可能会导致SortCompare不表现成一个稳定的比较函数。

</emu-note></emu-clause></emu-clause><emu-clause id="sec-array.prototype.splice">

22.1.3.26Array.prototype.splice (<var>start</var>, <var>deleteCount</var>, ...<var>items</var> )#

<emu-note>注释 1

splice函数以两个或多个参数调用,<var>start</var>, <var>deleteCount</var>和一个或多个<var>items</var>,从数组的<var>start</var>下标开始的<var>deleteCount</var>个数组元素会被参数中的<var>items</var>替换。返回一个包含被删除元素(如果有)的数组。

</emu-note>

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>relativeStart</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>start</var>)。
  4. 如果 <var>relativeStart</var> < 0, 让 <var>actualStart</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeStart</var>), 0); 否则 让 <var>actualStart</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeStart</var>, <var>len</var>)。
  5. 如果真实参数个数为0, 那么
    1. 让 <var>insertCount</var> = 0。
    2. 让 <var>actualDeleteCount</var> = 0。
  6. 否则,如果真实参数个数为1, 那么
    1. 让 <var>insertCount</var> = 0。
    2. 让 <var>actualDeleteCount</var> = <var>len</var> - <var>actualStart</var>。
  7. 否则,
    1. 让 <var>insertCount</var>等于真实参数个数减2。
    2. 让 <var>dc</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>deleteCount</var>)。
    3. 让 <var>actualDeleteCount</var> = <emu-xref aoid="min">min</emu-xref>(<emu-xref aoid="max">max</emu-xref>(<var>dc</var>, 0), <var>len</var> - <var>actualStart</var>)。
  8. 如果 <var>len</var>+<var>insertCount</var>-<var>actualDeleteCount</var> > 253-1, 抛出<emu-val>TypeError</emu-val>异常。
  9. 让 <var>A</var> = <emu-xref aoid="ArraySpeciesCreate">ArraySpeciesCreate</emu-xref>(<var>O</var>, <var>actualDeleteCount</var>)。
  10. 让 <var>k</var> = 0。
  11. 重复, 当 <var>k</var> < <var>actualDeleteCount</var>
    1. 让 <var>from</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>actualStart</var>+<var>k</var>)。
    2. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>from</var>)。
    3. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>fromValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>from</var>)。
      2. 执行 <emu-xref aoid="CreateDataPropertyOrThrow">CreateDataPropertyOrThrow</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>), <var>fromValue</var>)。
    4. <var>k</var> 加 1。
  12. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, "length", <var>actualDeleteCount</var>, <emu-val>true</emu-val>)。
  13. 让 <var>items</var>为一个<emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>,元素为真实参数从左到右第三个起的所有元素。如果传递的真实参数少于3个,这个列表为空。
  14. 让 <var>itemCount</var> = the number of elements in <var>items</var>。
  15. 如果 <var>itemCount</var> < <var>actualDeleteCount</var>, 那么
    1. 让 <var>k</var> = <var>actualStart</var>。
    2. 重复, 当 <var>k</var> < (<var>len</var> - <var>actualDeleteCount</var>)
      1. 让 <var>from</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>+<var>actualDeleteCount</var>)。
      2. 让 <var>to</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>+<var>itemCount</var>)。
      3. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>from</var>)。
      4. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>fromValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>from</var>)。
        2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>to</var>, <var>fromValue</var>, <emu-val>true</emu-val>)。
      5. 否则 <var>fromPresent</var> 等于 <emu-val>false</emu-val>,
        1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>to</var>)。
      6. <var>k</var> 加 1。
    3. 让 <var>k</var> = <var>len</var>。
    4. 重复, 当 <var>k</var> > (<var>len</var> - <var>actualDeleteCount</var> + <var>itemCount</var>)
      1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>-1))。
      2. <var>k</var> 减 1。
  16. 否则 如果 <var>itemCount</var> > <var>actualDeleteCount</var>, 那么
    1. 让 <var>k</var> = (<var>len</var> - <var>actualDeleteCount</var>)。
    2. 重复, 当 <var>k</var> > <var>actualStart</var>
      1. 让 <var>from</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var> + <var>actualDeleteCount</var> - 1)。
      2. 让 <var>to</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var> + <var>itemCount</var> - 1)。
      3. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>from</var>)。
      4. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>fromValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>from</var>)。
        2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>to</var>, <var>fromValue</var>, <emu-val>true</emu-val>)。
      5. 否则 <var>fromPresent</var> 等于 <emu-val>false</emu-val>,
        1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>to</var>)。
      6. <var>k</var> 减 1。
  17. 让 <var>k</var> = <var>actualStart</var>。
  18. 重复, 当 <var>items</var> 不为空
    1. 删除<var>items</var>的第一个元素并且让 <var>E</var>等于这个元素的值。
    2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>), <var>E</var>, <emu-val>true</emu-val>)。
    3. <var>k</var> 加 1。
  19. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", <var>len</var> - <var>actualDeleteCount</var> + <var>itemCount</var>, <emu-val>true</emu-val>)。
  20. 返回 <var>A</var>。

</emu-alg><emu-note>注释 2

在第19步中明确的设置结果数组的length属性在以前的ECMAScript版本中是有必要的,用来确保length属性是正确的当结果数组的随后的元素没有出现。设置length属性从ES2015开始不是必要的了,因为结果数组是用本身的长度来初始化的,而不是空数组。设置它是为了保持向后兼容性。

</emu-note><emu-note>注释 3

splice函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.tolocalestring">

22.1.3.27Array.prototype.toLocaleString ( [ <var>reserved1</var> [ , <var>reserved2</var> ] ] )#

是一个包括ecma-402国际化API的ECMAScript实现,必须实现如ECMA-402规范申明的Array.prototype.toLocaleString方法。如果一个ECMAScript实现没有包括ECMA-402国际化API,会使用以下申明的toLocaleString方法。

<emu-note>注释 1

ecma-402第一版没有一个替代Array.prototype.toLocaleString 方法的申明。

</emu-note>

这个方法的可选参数的含义定义在ECMA-402规范中; 不支持ECMA-402的实现不能使用别的位置的参数。

步骤如下:

<emu-alg>

  1. 让 <var>array</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>array</var>, "length"))。
  3. 让 <var>separator</var> 等于适合于宿主环境的当前区域设置的列表分隔符字符串的字符串值(这是在实现定义的方式)。
  4. 如果 <var>len</var> 等于 zero, 返回空字符串。
  5. 让 <var>firstElement</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>array</var>, "0")。
  6. 如果 <var>firstElement</var> 等于 <emu-val>undefined</emu-val> 或者 <emu-val>null</emu-val>, 那么
    1. 让 <var>R</var> 等于空字符串。
  7. 否则,
    1. 让 <var>R</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<emu-xref aoid="Invoke">Invoke</emu-xref>(<var>firstElement</var>, "toLocaleString"))。
  8. 让 <var>k</var> = 1
  9. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>S</var> 等于 <var>R</var> 和 <var>separator</var> 连接后的字符串。
    2. 让 <var>nextElement</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>array</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>))。
    3. 如果 <var>nextElement</var> 等于 <emu-val>undefined</emu-val> 或者 <emu-val>null</emu-val>, 那么
      1. 让 <var>R</var> 等于空字符串。
    4. 否则,
      1. 让 <var>R</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<emu-xref aoid="Invoke">Invoke</emu-xref>(<var>nextElement</var>, "toLocaleString"))。
    5. 让 <var>R</var> 等于 <var>S</var> 和 <var>R</var> 连接后的字符串。
    6. <var>k</var> 加 1。
  10. 返回 <var>R</var>。

</emu-alg><emu-note>注释 2

数组元素是用toLocaleString方法传递给字符串的,这些字符串是如此的连接,由已定义的区域设置特定方法中派生的分隔符字符串的分隔而分离的。调用这个函数的结果是类似于 toString的结果,除了这个函数的结果是特定场所。

</emu-note><emu-note>注释 3

toLocaleString 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.tostring">

22.1.3.28Array.prototype.toString ( )#

toString 方法的调用步骤如下:

<emu-alg>

  1. 让 <var>array</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 让 <var>func</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>array</var>, "join")。
  3. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>func</var>) 为 <emu-val>false</emu-val>, 让 <var>func</var> 等于固有方法 <emu-xref href="#sec-object.prototype.tostring">%ObjProto_toString%</emu-xref>。
  4. 返回 <emu-xref aoid="Call">Call</emu-xref>(<var>func</var>, <var>array</var>)。

</emu-alg><emu-note>注释

toString 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.unshift">

22.1.3.29Array.prototype.unshift ( ...<var>items</var> )#

<emu-note>注释 1

参数添加到数组的开始,他们在数组的顺序和参数列表的顺序一致。

</emu-note>

unshift 方法以一个或多个参数调用, <var>item1</var>、<var>item2</var>等等,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val>)。
  2. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, "length"))。
  3. 让 <var>argCount</var> 等于真实参数的个数。
  4. 如果 <var>argCount</var> > 0, 那么
    1. 如果 <var>len</var>+<var>argCount</var> > 253-1, 抛出<emu-val>TypeError</emu-val>异常。
    2. 让 <var>k</var> = <var>len</var>。
    3. 重复, 当 <var>k</var> > 0,
      1. 让 <var>from</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>-1)。
      2. 让 <var>to</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>+<var>argCount</var>-1)。
      3. 让 <var>fromPresent</var> = <emu-xref aoid="HasProperty">HasProperty</emu-xref>(<var>O</var>, <var>from</var>)。
      4. 如果 <var>fromPresent</var> 等于 <emu-val>true</emu-val>, 那么
        1. 让 <var>fromValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>from</var>)。
        2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>to</var>, <var>fromValue</var>, <emu-val>true</emu-val>)。
      5. 否则 <var>fromPresent</var> 等于 <emu-val>false</emu-val>,
        1. 执行 <emu-xref aoid="DeletePropertyOrThrow">DeletePropertyOrThrow</emu-xref>(<var>O</var>, <var>to</var>)。
      6. <var>k</var> 减 1。
    4. 让 <var>j</var> = 0。
    5. 让 <var>items</var> 等于函数调用时从左到右的参数组成的 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>。
    6. 重复, 当 <var>items</var> 不为空
      1. 移除<var>items</var>的第一个元素并且让 <var>E</var> 等于移除的这个元素。
      2. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>j</var>), <var>E</var>, <emu-val>true</emu-val>)。
      3. <var>j</var> 加 1。
  5. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, "length", <var>len</var>+<var>argCount</var>, <emu-val>true</emu-val>)。
  6. 返回 <var>len</var>+<var>argCount</var>。

</emu-alg>

unshift 方法的 length 属性值为1。

<emu-note>注释 2

unshift 函数是特有的通用的; 它不要求<emu-val>this</emu-val>的值是一个数组对象。因此它可以被转变成其他种类的对象来作为一个函数使用。

</emu-note></emu-clause><emu-clause id="sec-array.prototype.values">

22.1.3.30Array.prototype.values ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<emu-val>this</emu-val> value)。
  2. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "value")。

</emu-alg>

这个函数是固有对象 <dfn>%ArrayProto_values%</dfn>。

</emu-clause><emu-clause id="sec-array.prototype-@@iterator">

22.1.3.31Array.prototype [ @@iterator ] ( )#

@@iterator属性的初始值和Array.prototype.values属性的初始值是同一个函数对象。

</emu-clause><emu-clause id="sec-array.prototype-@@unscopables">

22.1.3.32Array.prototype [ @@unscopables ]#

@@unscopables 数据属性的初始值是通过以下步骤创建的:

<emu-alg>

  1. 让 <var>blackList</var> = <emu-xref aoid="ObjectCreate">ObjectCreate</emu-xref>(<emu-val>null</emu-val>)。
  2. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "copyWithin", <emu-val>true</emu-val>)。
  3. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "entries", <emu-val>true</emu-val>)。
  4. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "fill", <emu-val>true</emu-val>)。
  5. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "find", <emu-val>true</emu-val>)。
  6. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "findIndex", <emu-val>true</emu-val>)。
  7. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "includes", <emu-val>true</emu-val>)。
  8. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "keys", <emu-val>true</emu-val>)。
  9. 执行 <emu-xref aoid="CreateDataProperty">CreateDataProperty</emu-xref>(<var>blackList</var>, "values", <emu-val>true</emu-val>)。
  10. 断言: 以上的每个调用都会返回 <emu-val>true</emu-val>。
  11. 返回 <var>blackList</var>。

</emu-alg>

这个特性的属性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>true</emu-val> }。

<emu-note>NOTE

这个对象自身的属性名是不包括作为 Array.prototype 的ECMAScript 2015规范之前的属性名。这些名字都被忽略了 with 为语句结合目的保留行为的现有代码,可以使用一个名为外部范围的 with 声明其绑定的对象是一个数组对象阴影的绑定。

</emu-note></emu-clause></emu-clause><emu-clause id="sec-properties-of-array-instances">

22.1.4数组实例的属性#

数组实例是数组外来对象,这个对象有内部方法的申明。数组实例从数组原型对象上继承属性。

数组实例有 length 属性, 和一系列可枚举的数组下标属性。

<emu-clause id="sec-properties-of-array-instances-length">

22.1.4.1length#

数组实例的 length 属性是一个数值属性,它的值在数值上总是大于每一个可配置的数组下标属性名字。

length 属性的初始特性为 { [[Writable]]: <emu-val>true</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

<emu-note>注释

删除的自身数组元素减小 length 属性的值,删除的自身数组元素的下标在新的和旧的长度值之间时会有副作用。然而,不可配置的属性不能被删除。尝试去设置一个数组对象的 length 属性为一个比已存在的不可配置的数组下标中最大的数值属性名字小的值,将会导致length 的值为比那个最大属性名还大的数值。查看<emu-xref href="#sec-array-exotic-objects-defineownproperty-p-desc">9.4.2.1</emu-xref>。

</emu-note></emu-clause></emu-clause><emu-clause id="sec-array-iterator-objects">

22.1.5数组的迭代器对象#

数组迭代器是一个对象,这代表了一个明确的重复在明确的数组实例对象上。数组迭代器对象没有具名构造器。替代的是,通过调用数组实例对象上的方法来创建迭代器。

<emu-clause id="sec-createarrayiterator" aoid="CreateArrayIterator">

22.1.5.1抽象操作CreateArrayIterator#

有几个数组对象返回数组迭代器。抽象操作CreateArrayIterator以参数<var>array</var> 和 <var>kind</var> 调用就是用来创建这样一个迭代对象,步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>array</var>) 是一个对象。
  2. 让 <var>iterator</var> = <emu-xref aoid="ObjectCreate">ObjectCreate</emu-xref>(<emu-xref href="#sec-%arrayiteratorprototype%-object">%ArrayIteratorPrototype%</emu-xref>, « [[IteratedObject]], [[ArrayIteratorNextIndex]], [[ArrayIterationKind]] »)。
  3. 设置 <var>iterator</var> 的 [[IteratedObject]] 内部位置为 <var>array</var>。
  4. 设置 <var>iterator</var> 的 [[ArrayIteratorNextIndex]] 内部位置为 0。
  5. 设置 <var>iterator</var> 的 [[ArrayIterationKind]] 内部位置为 <var>kind</var>。
  6. 返回 <var>iterator</var>。

</emu-alg></emu-clause><emu-clause id="sec-%arrayiteratorprototype%-object">

22.1.5.2%ArrayIteratorPrototype%对象#

所有的数组迭代对象从内部对象%ArrayIteratorPrototype%中继承属性。<dfn>%ArrayIteratorPrototype%</dfn> 是一个普通的对象,它的 [[Prototype]] 内部位置是固有对象 <emu-xref href="#sec-%iteratorprototype%-object">%IteratorPrototype%</emu-xref>。另外, %ArrayIteratorPrototype% 有以下特性:

<emu-clause id="sec-%arrayiteratorprototype%.next">

22.1.5.2.1%ArrayIteratorPrototype%.next( )#

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不是对象, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有数组迭代器实例的所有内部位置(<emu-xref href="#sec-properties-of-array-iterator-instances">22.1.5.3</emu-xref>), 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>a</var> 等于 <var>O</var> 的内部位置 [[IteratedObject]]。
  5. 如果 <var>a</var> 等于 <emu-val>undefined</emu-val>, 返回 <emu-xref aoid="CreateIterResultObject">CreateIterResultObject</emu-xref>(<emu-val>undefined</emu-val>, <emu-val>true</emu-val>)。
  6. 让 <var>index</var> 等于 <var>O</var> 的内部位置[[ArrayIteratorNextIndex]]。
  7. 让 <var>itemKind</var> 等于 <var>O</var> 的内部位置 [[ArrayIterationKind]]。
  8. 如果 <var>a</var> 有内部位置 [[TypedArrayName]], 那么
    1. 让 <var>len</var> 等于 <var>a</var> 的内部位置 [[ArrayLength]]。
  9. 否则,
    1. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>a</var>, "length"))。
  10. 如果 <var>index</var> ≥ <var>len</var>, 那么
    1. 设置 <var>O</var> 的内部位置 [[IteratedObject]] 的值为 <emu-val>undefined</emu-val>。
    2. 返回 <emu-xref aoid="CreateIterResultObject">CreateIterResultObject</emu-xref>(<emu-val>undefined</emu-val>, <emu-val>true</emu-val>)。
  11. 设置 <var>O</var> 的内部位置 [[ArrayIteratorNextIndex]] 的值为 <var>index</var>+1。
  12. 如果 <var>itemKind</var> 等于 "key", 返回 <emu-xref aoid="CreateIterResultObject">CreateIterResultObject</emu-xref>(<var>index</var>, <emu-val>false</emu-val>)。
  13. 让 <var>elementKey</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>index</var>)。
  14. 让 <var>elementValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>a</var>, <var>elementKey</var>)。
  15. 如果 <var>itemKind</var> 等于 "value", 让 <var>result</var> = <var>elementValue</var>。
  16. 否则,
    1. 断言: <var>itemKind</var> 等于 "key+value"
    2. 让 <var>result</var> = <emu-xref aoid="CreateArrayFromList">CreateArrayFromList</emu-xref>(« <var>index</var>, <var>elementValue</var> »)。
  17. 返回 <emu-xref aoid="CreateIterResultObject">CreateIterResultObject</emu-xref>(<var>result</var>, <emu-val>false</emu-val>)。

</emu-alg></emu-clause><emu-clause id="sec-%arrayiteratorprototype%-@@tostringtag">

22.1.5.2.2%ArrayIteratorPrototype% [ @@toStringTag ]#

@@toStringTag属性的初始值为字符串"Array Iterator"

这个属性的特性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>true</emu-val> }。

</emu-clause></emu-clause><emu-clause id="sec-properties-of-array-iterator-instances">

22.1.5.3数组迭代器实例的属性#

数组迭代器实例是继承固有对象<emu-xref href="#sec-%arrayiteratorprototype%-object">%ArrayIteratorPrototype%</emu-xref>属性的普通对象。数组迭代器实例初始化时会创建的内部位置列在<emu-xref href="#table-48">Table 49</emu-xref>。

<emu-table id="table-48" caption="Internal Slots of Array Iterator Instances">

<figure>

<figcaption>Table 49: 数组迭代器实例内部位置</figcaption>

| 内部位置 | 描述 | | [[IteratedObject]] | 数组元素被迭代的对象。 | | [[ArrayIteratorNextIndex]] | 当前迭代的下一次被检测的整数下标。 | | [[ArrayIterationKind]] | 标识迭代的每个元素返回的字符串值。可能值是: "key""value""key+value". |

</figure>

</emu-table></emu-clause></emu-clause></emu-clause><emu-clause id="sec-typedarray-objects">

22.2TypedArray对象#

<var>TypedArray</var> 对象提出一个基本的二进制数据缓冲区的类数组视图(<emu-xref href="#sec-arraybuffer-objects">24.1</emu-xref>)。<var>TypedArray</var> 实例的每个元素有同样的基本二进制标量数据类型。有明确的 <var>TypedArray</var> 构造器,列在 <emu-xref href="#table-49">Table 50</emu-xref>的9个支持元素种类的每一个。每个构造器 <emu-xref href="#table-49">Table 50</emu-xref> 都和原型对象有相应的区别。

<emu-table id="table-49" caption="The TypedArray Constructors">

<figure>

<figcaption>Table 50: The TypedArray Constructors</figcaption>

| 构造函数名称和本征函数 | 元素种类 | 元素大小 | 转换操作 | 描述 | 等效的C型 | | Int8Array %Int8Array% | Int8 | 1 | <emu-xref aoid="ToInt8">ToInt8</emu-xref> | 8位2的补符号整数 | 有符号字符 | | Uint8Array %Uint8Array% | Uint8 | 1 | <emu-xref aoid="ToUint8">ToUint8</emu-xref> | 8位无符号整形 | 无符号字符 | | Uint8ClampedArray %Uint8ClampedArray% | Uint8C | 1 | <emu-xref aoid="ToUint8Clamp">ToUint8Clamp</emu-xref> | 8位 无符号整形 (卡转换) | 无符号字符 | | Int16Array %Int16Array% | Int16 | 2 | <emu-xref aoid="ToInt16">ToInt16</emu-xref> | 16位2的补符号整数 | short | | Uint16Array %Uint16Array% | Uint16 | 2 | <emu-xref aoid="ToUint16">ToUint16</emu-xref> | 16位无符号整形 | 无符号短整型 | | Int32Array %Int32Array% | Int32 | 4 | <emu-xref aoid="ToInt32">ToInt32</emu-xref> | 32位2的补符号整数 | 整形 | | Uint32Array %Uint32Array% | Uint32 | 4 | <emu-xref aoid="ToUint32">ToUint32</emu-xref> | 32位无符号整形 | 无符号整形 | | Float32Array %Float32Array% | Float32 | 4 | 32位IEEE浮点数 | 单精度浮点数 | | Float64Array %Float64Array% | Float64 | 8 | 64位IEEE浮点数 | 双精度浮点数 |

</figure>

</emu-table>

在下面的定义中,<var>TypedArray</var>的参照应该替换成上表中的构造器函数名。表达式“元素字节大小”指的是对应的构造器的元素大小列的值。表达式 “元素种类”指的是该行的元素种类列。

<emu-clause id="sec-%typedarray%-intrinsic-object">

22.2.1固有对象%TypedArray%#

固有对象<dfn>%TypedArray%</dfn>是一个函数构造器对象,所有的 <var>TypedArray</var> 构造器对象继承于%TypedArray%,并且相应的原型对象共有属性被继承于所有的 <var>TypedArray</var> 构造器和它们的实例。固有对象 %TypedArray% 没有全局名字也不会表现的像<emu-xref href="#global-object">全局对象</emu-xref>的一个属性。

固有函数对象%TypedArray%表现的像多样的<var>TypedArray</var>构造器的抽象父类。因为它是一个抽象类构造器调用的时候会抛出错误。构造器 <var>TypeArray</var> 不会执行一个父类的构造函数。

<emu-clause id="sec-%typedarray%">

22.2.1.1%TypedArray%()#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref> 构造器有以下步骤:

<emu-alg>

  1. 抛出<emu-val>TypeError</emu-val>异常。

</emu-alg>

构造器函数<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref> 的length 属性值为 0。

</emu-clause></emu-clause><emu-clause id="sec-properties-of-the-%typedarray%-intrinsic-object">

22.2.2固有对象%TypedArray%的属性#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref> 的内部位置[[Prototype]]的值是固有对象<emu-xref href="#sec-properties-of-the-function-prototype-object">%FunctionPrototype%</emu-xref>。

构造器函数<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>的name属性的值为 "TypedArray"

构造器<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref> 有以下属性:

<emu-clause id="sec-%typedarray%.from">

22.2.2.1%TypedArray%.from ( <var>source</var> [ , <var>mapfn</var> [ , <var>thisArg</var> ] ] )#

from 方法以参数<var>source</var>和可选参数<var>mapfn</var>、<var>thisArg</var>调用时,步骤如下:

<emu-alg>

  1. 让 <var>C</var> = the <emu-val>this</emu-val> value。
  2. 如果 <emu-xref aoid="IsConstructor">IsConstructor</emu-xref>(<var>C</var>) 等于 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果提供了 <var>mapfn</var> 并且 <var>mapfn</var> 不等于 <emu-val>undefined</emu-val>, 那么
    1. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>mapfn</var>) 为 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    2. 让 <var>mapping</var> = <emu-val>true</emu-val>。
  4. 否则, 让 <var>mapping</var> = <emu-val>false</emu-val>。
  5. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  6. 让 <var>arrayLike</var> = <emu-xref aoid="IterableToArrayLike">IterableToArrayLike</emu-xref>(<var>source</var>)。
  7. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, "length"))。
  8. 让 <var>targetObj</var> = <emu-xref aoid="TypedArrayCreate">TypedArrayCreate</emu-xref>(<var>C</var>, « <var>len</var> »)。
  9. 让 <var>k</var> = 0。
  10. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, <var>Pk</var>)。
    3. 如果 <var>mapping</var> 等于 <emu-val>true</emu-val>, 那么
      1. 让 <var>mappedValue</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>mapfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var> »)。
    4. 否则, 让 <var>mappedValue</var> = <var>kValue</var>。
    5. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>targetObj</var>, <var>Pk</var>, <var>mappedValue</var>, <emu-val>true</emu-val>)。
    6. <var>k</var> 加 1。
  11. 返回 <var>targetObj</var>。

</emu-alg><emu-clause id="sec-iterabletoarraylike" aoid="IterableToArrayLike">

22.2.2.1.1执行期语意学: IterableToArrayLike( <var>items</var> )#

抽象操作IterableToArrayLike执行步骤如下:

<emu-alg>

  1. 让 <var>usingIterator</var> = <emu-xref aoid="GetMethod">GetMethod</emu-xref>(<var>items</var>, @@iterator)。
  2. 如果 <var>usingIterator</var> 不等于 <emu-val>undefined</emu-val>, 那么
    1. 让 <var>iterator</var> = <emu-xref aoid="GetIterator">GetIterator</emu-xref>(<var>items</var>, <var>usingIterator</var>)。
    2. 让 <var>values</var> 等于一个空 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>。
    3. 让 <var>next</var> = <emu-val>true</emu-val>。
    4. 重复, 当 <var>next</var> 不等于 <emu-val>false</emu-val>
      1. 让 <var>next</var> = <emu-xref aoid="IteratorStep">IteratorStep</emu-xref>(<var>iterator</var>)。
      2. 如果 <var>next</var> 不等于 <emu-val>false</emu-val>, 那么
        1. 让 <var>nextValue</var> = <emu-xref aoid="IteratorValue">IteratorValue</emu-xref>(<var>next</var>)。
        2. 将 <var>nextValue</var> 追加到 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>值得最后。
    5. 返回 <emu-xref aoid="CreateArrayFromList">CreateArrayFromList</emu-xref>(<var>values</var>)。
  3. 注释: <var>items</var> 不是一个迭代器因此假设它已经是一个类数组。
  4. 返回 <emu-xref aoid="ToObject">ToObject</emu-xref>(<var>items</var>)。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-%typedarray%.of">

22.2.2.2%TypedArray%.of ( ...<var>items</var> )#

of方法以任何个数的参数调用,步骤如下:

<emu-alg>

  1. 让 <var>len</var> 等于传递给函数的实际参数的个数。
  2. 让 <var>items</var> 等于传给函数的参数 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>。
  3. 让 <var>C</var> = <emu-val>this</emu-val>。
  4. 如果 <emu-xref aoid="IsConstructor">IsConstructor</emu-xref>(<var>C</var>) 为 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  5. 让 <var>newObj</var> = <emu-xref aoid="TypedArrayCreate">TypedArrayCreate</emu-xref>(<var>C</var>, « <var>len</var> »)。
  6. 让 <var>k</var> = 0。
  7. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>kValue</var> = <var>items</var>[<var>k</var>]。
    2. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    3. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>newObj</var>, <var>Pk</var>, <var>kValue</var>, <emu-val>true</emu-val>)。
    4. <var>k</var> 加 1。
  8. 返回 <var>newObj</var>。

</emu-alg><emu-note>注释

<var>items</var> 参数假设是结构良好的静止的参数值。

</emu-note></emu-clause><emu-clause id="sec-%typedarray%.prototype">

22.2.2.3%TypedArray%.prototype#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype 的初始值是固有对象<emu-xref href="#sec-properties-of-the-%typedarrayprototype%-object">%TypedArrayPrototype%</emu-xref>。

这个属性的特性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

</emu-clause><emu-clause id="sec-get-%typedarray%-@@species">

22.2.2.4get %TypedArray% [ @@species ]#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>[@@species] 是访问属性,它的设置属性是<emu-val>undefined</emu-val>。它的访问属性步骤如下:

<emu-alg>

  1. 返回<emu-val>this</emu-val>值。

</emu-alg>

这个函数的 name 属性为 "get [Symbol.species]"

<emu-note>注释

<emu-xref href="#sec-properties-of-the-%typedarrayprototype%-object">%TypedArrayPrototype%</emu-xref> 方法正常的使用this对象的构造函数去创建一个衍生对象。然而,子类构造器可能通过重定义@@species属性来重载这个默认行为。

</emu-note></emu-clause></emu-clause><emu-clause id="sec-properties-of-the-%typedarrayprototype%-object">

22.2.3%TypedArrayPrototype%对象的属性#

<dfn>%TypedArrayPrototype%</dfn>对象的内部位置[[Prototype]]的值为固有对象<emu-xref href="#sec-properties-of-the-object-prototype-object">%ObjectPrototype%</emu-xref>。%TypedArrayPrototype% 对象是一个普通对象。它不会有[[ViewedArrayBuffer]]或者其他的内部位置申明在<var>TypedArray</var>实例对象上。

<emu-clause id="sec-get-%typedarray%.prototype.buffer">

22.2.3.1获取%TypedArray%.prototype.buffer#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.buffer是访问函数,他的设置函数是<emu-val>undefined</emu-val>。它的获取函数步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有内部位置 [[ViewedArrayBuffer]], 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>buffer</var>等于<var>O</var> 的内部位置[[ViewedArrayBuffer]]。
  5. 返回 <var>buffer</var>。

</emu-alg></emu-clause><emu-clause id="sec-get-%typedarray%.prototype.bytelength">

22.2.3.2获取%TypedArray%.prototype.byteLength#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.byteLength是访问函数,他的设置函数是<emu-val>undefined</emu-val>。它的获取函数步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有内部位置[[ViewedArrayBuffer]], 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>buffer</var>等于<var>O</var> 的内部位置 [[ViewedArrayBuffer]]。
  5. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 返回 0。
  6. 让 <var>size</var> 等于 <var>O</var> 的内部位置 [[ByteLength]]。
  7. 返回 <var>size</var>。

</emu-alg></emu-clause><emu-clause id="sec-get-%typedarray%.prototype.byteoffset">

22.2.3.3获取%TypedArray%.prototype.byteOffset#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.byteOffset是访问函数,他的设置函数是<emu-val>undefined</emu-val>。它的获取函数步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var>没有内部位置 [[ViewedArrayBuffer]], 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>buffer</var> 等于 <var>O</var> 的内部位置 [[ViewedArrayBuffer]]。
  5. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 返回 0。
  6. 让 <var>offset</var> 等于 <var>O</var> 的内部位置 [[ByteOffset]]。
  7. 返回 <var>offset</var>。

</emu-alg></emu-clause><emu-clause id="sec-%typedarray%.prototype.constructor">

22.2.3.4%TypedArray%.prototype.constructor#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.constructor 的初始值是固有对象<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.copywithin">

22.2.3.5%TypedArray%.prototype.copyWithin (<var>target</var>, <var>start</var> [ , <var>end</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.copyWithin 是一个固有函数,执行和<emu-xref href="#sec-array.prototype.copywithin">22.1.3.3</emu-xref>定义的Array.prototype.copyWithin同样的算法,除非<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 被访问于执行"length"的[[Get]]操作的位置并且在12步中值得真实副本必须以保留源数据的位级编码的方式进行。

这个算法可能被优化,如果知道<emu-val>this</emu-val>的值有固定的长度,并且整数下标属性是不稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般函数,<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref> 在执行算法之前就提供给了<emu-val>this</emu-val>对象。如果结果是一个 <emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>,会抛出异常而不是执行算法。

<emu-clause id="sec-validatetypedarray" aoid="ValidateTypedArray">

22.2.3.5.1执行期语意学: ValidateTypedArray ( <var>O</var> )#

以<var>O</var>为参数调用,步骤如下:

<emu-alg>

  1. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  2. 如果 <var>O</var> 没有内部位置 [[TypedArrayName]], 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有内部位置 [[ViewedArrayBuffer]], 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>buffer</var> 等于 <var>O</var> 的内部位置[[ViewedArrayBuffer]]。
  5. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  6. 返回 <var>buffer</var>。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-%typedarray%.prototype.entries">

22.2.3.6%TypedArray%.prototype.entries ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "key+value")。

</emu-alg></emu-clause><emu-clause id="sec-%typedarray%.prototype.every">

22.2.3.7%TypedArray%.prototype.every ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.every 是一个独特的方法,实现了和Array.prototype.every在<emu-xref href="#sec-array.prototype.every">22.1.3.5</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>callbackfn</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.fill">

22.2.3.8%TypedArray%.prototype.fill (<var>value</var> [ , <var>start</var> [ , <var>end</var> ] ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.fill 是一个独特的方法,实现了和Array.prototype.fill在<emu-xref href="#sec-array.prototype.fill">22.1.3.6</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。 这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.filter">

22.2.3.9%TypedArray%.prototype.filter ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.filter的解释和所用的参数和Array.prototype.filter在<emu-xref href="#sec-array.prototype.filter">22.1.3.7</emu-xref>中定义的是一样的。

filter方法以一个或两个参数参数调用,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 让 <var>len</var> 等于 <var>O</var> 的内部位置 [[ArrayLength]] 的值。
  4. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 为 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  5. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  6. 让 <var>kept</var> 等于新建的空的 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>。
  7. 让 <var>k</var> = 0。
  8. 让 <var>captured</var> = 0。
  9. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 让 <var>selected</var> = <emu-xref aoid="ToBoolean">ToBoolean</emu-xref>(<emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »))。
    4. 如果 <var>selected</var> 等于 <emu-val>true</emu-val>, 那么
      1. 追加<var>kValue</var>到<var>kept</var>的末尾。
      2. <var>captured</var> 加 1。
    5. <var>k</var> 加 1。
  10. 让 <var>A</var> = <emu-xref aoid="TypedArraySpeciesCreate">TypedArraySpeciesCreate</emu-xref>(<var>O</var>, « <var>captured</var> »)。
  11. 让 <var>n</var> = 0。
  12. 对于<var>kept</var>的每个元素<var>e</var>
    1. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>n</var>), <var>e</var>, <emu-val>true</emu-val>)。
    2. <var>n</var> 加 1。
  13. 返回 <var>A</var>。

</emu-alg>

这个函数不是一般的函数,<emu-val>this</emu-val>的值必须是一个对象并且有内部位置[[TypedArrayName]]。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.find">

22.2.3.10%TypedArray%.prototype.find (<var>predicate</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.find是一个独特的方法,实现了和Array.prototype.find在<emu-xref href="#sec-array.prototype.find">22.1.3.8</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>predicate</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.findindex">

22.2.3.11%TypedArray%.prototype.findIndex ( <var>predicate</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.findIndex是一个独特的方法,实现了和Array.prototype.findIndex在<emu-xref href="#sec-array.prototype.findindex">22.1.3.9</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>predicate</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。 1 </emu-clause><emu-clause id="sec-%typedarray%.prototype.foreach">

22.2.3.12%TypedArray%.prototype.forEach ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.forEach是一个独特的方法,实现了和Array.prototype.forEach在<emu-xref href="#sec-array.prototype.foreach">22.1.3.10</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>callbackfn</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.indexof">

22.2.3.13%TypedArray%.prototype.indexOf (<var>searchElement</var> [ , <var>fromIndex</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.indexOf是一个独特的方法,实现了和Array.prototype.indexOf在<emu-xref href="#sec-array.prototype.indexof">22.1.3.12</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.includes">

22.2.3.14%TypedArray%.prototype.includes ( <var>searchElement</var> [ , <var>fromIndex</var> ] )#

%TypedArray%.prototype.includes是一个独特的方法,实现了和Array.prototype.includes在<emu-xref href="#sec-array.prototype.includes">22.1.3.11</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.join">

22.2.3.15%TypedArray%.prototype.join ( <var>separator</var> )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.join是一个独特的方法,实现了和Array.prototype.join在<emu-xref href="#sec-array.prototype.join">22.1.3.13</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.keys">

22.2.3.16%TypedArray%.prototype.keys ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "key")。

</emu-alg></emu-clause><emu-clause id="sec-%typedarray%.prototype.lastindexof">

22.2.3.17%TypedArray%.prototype.lastIndexOf ( <var>searchElement</var> [ , <var>fromIndex</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.lastIndexOf是一个独特的方法,实现了和Array.prototype.lastIndexOf在<emu-xref href="#sec-array.prototype.lastindexof">22.1.3.15</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-get-%typedarray%.prototype.length">

22.2.3.18get %TypedArray%.prototype.length#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.length是一个获取属性,它的设置属性的方法是<emu-val>undefined</emu-val>。它的获取函数步骤如下: <emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>)不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有内部位置 [[TypedArrayName]],抛出<emu-val>TypeError</emu-val>异常。
  4. 断言: <var>O</var> 内部位置 [[ViewedArrayBuffer]] 和 [[ArrayLength]]。
  5. 让 <var>buffer</var> 等于 <var>O</var> 的内部位置 [[ViewedArrayBuffer]]。
  6. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 返回 0。
  7. 让 <var>length</var> 等于 <var>O</var> 的内部位置 [[ArrayLength]]。
  8. 返回 <var>length</var>。

</emu-alg>

这个函数不是一般的函数。<emu-val>this</emu-val>必须是一个对象,并且有内部位置 [[TypedArrayName]]。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.map">

22.2.3.19%TypedArray%.prototype.map ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.map 的解释和参数的使用和Array.prototype.map在<emu-xref href="#sec-array.prototype.map">22.1.3.16</emu-xref>中定义的是一样的。

map 方法以一个或两个参数调用时,步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 让 <var>len</var> 等于 <var>O</var> 的内部位置 [[ArrayLength]]。
  4. 如果 <emu-xref aoid="IsCallable">IsCallable</emu-xref>(<var>callbackfn</var>) 为 <emu-val>false</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  5. 如果提供了 <var>thisArg</var>, 让 <var>T</var> = <var>thisArg</var>; 否则 让 <var>T</var> = <emu-val>undefined</emu-val>。
  6. 让 <var>A</var> = <emu-xref aoid="TypedArraySpeciesCreate">TypedArraySpeciesCreate</emu-xref>(<var>O</var>, « <var>len</var> »)。
  7. 让 <var>k</var> = 0。
  8. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
    3. 让 <var>mappedValue</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>callbackfn</var>, <var>T</var>, « <var>kValue</var>, <var>k</var>, <var>O</var> »)。
    4. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, <var>Pk</var>, <var>mappedValue</var>, <emu-val>true</emu-val>)。
    5. <var>k</var> 加 1。
  9. 返回 <var>A</var>。

</emu-alg>

这个函数不是一般的函数。<emu-val>this</emu-val>必须是一个对象,并且有内部位置 [[TypedArrayName]]。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.reduce">

22.2.3.20%TypedArray%.prototype.reduce ( <var>callbackfn</var> [ , <var>initialValue</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.reduce是一个独特的方法,实现了和Array.prototype.reduce在<emu-xref href="#sec-array.prototype.reduce">22.1.3.19</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。 这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>callbackfn</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.reduceright">

22.2.3.21%TypedArray%.prototype.reduceRight ( <var>callbackfn</var> [ , <var>initialValue</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.reduceRight是一个独特的方法,实现了和Array.prototype.reduceRight在<emu-xref href="#sec-array.prototype.reduceright">22.1.3.20</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>callbackfn</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.reverse">

22.2.3.22%TypedArray%.prototype.reverse ( )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.reverse是一个独特的方法,实现了和Array.prototype.reverse在<emu-xref href="#sec-array.prototype.reverse">22.1.3.21</emu-xref>中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.set-overloaded-offset">

22.2.3.23%TypedArray%.prototype.set ( <var>overloaded</var> [ , <var>offset</var> ])#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.set是一个单函数,基于第一个参数的类型而重载自己的行为。

这个函数不是一般的函数。<emu-val>this</emu-val>必须是一个对象,并且有内部位置 [[TypedArrayName]]。

<emu-clause id="sec-%typedarray%.prototype.set-array-offset">

22.2.3.23.1%TypedArray%.prototype.set (<var>array</var> [ , <var>offset</var> ] )#

为<var>TypedArray</var>设置多元值,从对象<var>array</var>读取值。可选参数<var>offset</var>的值标明<var>TypedArray</var>的被写的第一个元素的位置下标。如果省略了,它被假设为0。

<emu-alg>

  1. 断言: <var>array</var> 是<emu-xref href="#sec-ecmascript-language-types">ECMAScript语言值</emu-xref>中除了有内部位置[[TypedArrayName]]外的其他任何对象。如果是这个一个对象,应用<emu-xref href="#sec-%typedarray%.prototype.set-typedarray-offset">22.2.3.23.2</emu-xref>中的定义。
  2. 让 <var>target</var> = <emu-val>this</emu-val>。
  3. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>target</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果 <var>target</var> 没有内部位置 [[TypedArrayName]], 抛出<emu-val>TypeError</emu-val>异常。
  5. 断言: <var>target</var> 有内部位置 [[ViewedArrayBuffer]]。
  6. 让 <var>targetOffset</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>offset</var>)。
  7. 如果 <var>targetOffset</var> < 0, 抛出<emu-val>RangeError</emu-val>异常。
  8. 让 <var>targetBuffer</var> 等于 <var>target</var> 的内部位置 [[ViewedArrayBuffer]]。
  9. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>targetBuffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  10. 让 <var>targetLength</var> 等于 <var>target</var> 的内部位置 [[ArrayLength]]。
  11. 让 <var>targetName</var> 等于<var>target</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  12. 让 <var>targetElementSize</var> 等于在<emu-xref href="#table-49">Table 50</emu-xref>中声明的<var>targetName</var>的元素大小数值。
  13. 让 <var>targetType</var> 等于在<emu-xref href="#table-49">Table 50</emu-xref>中声明的<var>targetName</var>的元素类型的字符串值。
  14. 让 <var>targetByteOffset</var> 等于 <var>target</var> 的内部位置 [[ByteOffset]]。
  15. 让 <var>src</var> = <emu-xref aoid="ToObject">ToObject</emu-xref>(<var>array</var>)。
  16. 让 <var>srcLength</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>src</var>, "length"))。
  17. 如果 <var>srcLength</var> + <var>targetOffset</var> > <var>targetLength</var>, 抛出<emu-val>RangeError</emu-val>异常。
  18. 让 <var>targetByteIndex</var> = <var>targetOffset</var> × <var>targetElementSize</var> + <var>targetByteOffset</var>。
  19. 让 <var>k</var> = 0。
  20. 让 <var>limit</var> = <var>targetByteIndex</var> + <var>targetElementSize</var> × <var>srcLength</var>。
  21. 重复, 当 <var>targetByteIndex</var> < <var>limit</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kNumber</var> = <emu-xref aoid="ToNumber">ToNumber</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>src</var>, <var>Pk</var>))。
    3. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>targetBuffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    4. 执行 <emu-xref aoid="SetValueInBuffer">SetValueInBuffer</emu-xref>(<var>targetBuffer</var>, <var>targetByteIndex</var>, <var>targetType</var>, <var>kNumber</var>)。
    5. 让 <var>k</var> = <var>k</var> + 1。
    6. 让 <var>targetByteIndex</var> = <var>targetByteIndex</var> + <var>targetElementSize</var>。
  22. 返回 <emu-val>undefined</emu-val>。

</emu-alg></emu-clause><emu-clause id="sec-%typedarray%.prototype.set-typedarray-offset">

22.2.3.23.2%TypedArray%.prototype.set(<var>typedArray</var> [ , <var>offset</var> ] )#

为<var>TypedArray</var>设置多元值,从对象<var>typedArray</var>的参数对象读取值。可选参数<var>offset</var>的值标明<var>TypedArray</var>的被写的第一个元素的位置下标。如果省略了,它被假设为0。

<emu-alg>

  1. 断言: <var>typedArray</var> 有内部位置 [[TypedArrayName]]。如果没有,应用<emu-xref href="#sec-%typedarray%.prototype.set-array-offset">22.2.3.23.1</emu-xref>中的定义。
  2. 让 <var>target</var> = <emu-val>this</emu-val>。
  3. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>target</var>) 不是一个对象, 抛出<emu-val>TypeError</emu-val>异常。
  4. 如果 <var>target</var> 没有内部位置 [[TypedArrayName]], 抛出<emu-val>TypeError</emu-val>异常。
  5. 断言: <var>target</var> 有内部位置 [[ViewedArrayBuffer]]。
  6. 让 <var>targetOffset</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>offset</var>)。
  7. 如果 <var>targetOffset</var> < 0, 抛出<emu-val>RangeError</emu-val>异常。
  8. 让 <var>targetBuffer</var> 等于 <var>target</var> 的内部位置 [[ViewedArrayBuffer]]。
  9. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>targetBuffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  10. 让 <var>targetLength</var> 等于 <var>target</var> 的内部位置 [[ArrayLength]]。
  11. 让 <var>srcBuffer</var> 等于 <var>typedArray</var> 的内部位置 [[ViewedArrayBuffer]]。
  12. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>srcBuffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  13. 让 <var>targetName</var> 等于 <var>target</var> 的内部位置 [[TypedArrayName]]的字符串值。
  14. 让 <var>targetType</var> 等于在<emu-xref href="#table-49">Table 50</emu-xref>中定义的<var>targetName</var>的元素类型的字符串值。
  15. 让 <var>targetElementSize</var> 等于在 <emu-xref href="#table-49">Table 50</emu-xref> 中定义的 <var>targetName</var>的元素大小的数值。
  16. 让 <var>targetByteOffset</var>等于 <var>target</var> 的内部位置 [[ByteOffset]]。
  17. 让 <var>srcName</var> 等于 <var>typedArray</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  18. 让 <var>srcType</var> 等于在 <emu-xref href="#table-49">Table 50</emu-xref>中定义的<var>srcName</var>的元素类型的字符串值。
  19. 让 <var>srcElementSize</var> 等于在 <emu-xref href="#table-49">Table 50</emu-xref> 中定义的 <var>srcName</var> 的元素大小的数值。
  20. 让 <var>srcLength</var> 等于 <var>typedArray</var> 的内部位置 [[ArrayLength]]。
  21. 让 <var>srcByteOffset</var> 等于 <var>typedArray</var> 的内部位置 [[ByteOffset]]。
  22. 如果 <var>srcLength</var> + <var>targetOffset</var> > <var>targetLength</var>, 抛出<emu-val>RangeError</emu-val>异常。
  23. 如果 <emu-xref aoid="SameValue">SameValue</emu-xref>(<var>srcBuffer</var>, <var>targetBuffer</var>) 为 <emu-val>true</emu-val>, 那么
    1. 让 <var>srcBuffer</var> = <emu-xref aoid="CloneArrayBuffer">CloneArrayBuffer</emu-xref>(<var>targetBuffer</var>, <var>srcByteOffset</var>, <emu-xref href="#sec-arraybuffer-constructor">%ArrayBuffer%</emu-xref>)。
    2. 注释: <emu-xref href="#sec-arraybuffer-constructor">%ArrayBuffer%</emu-xref> 是用来克隆 <var>targetBuffer</var> 的,因为它被认为是没有任何显著的副作用的。
    3. 让 <var>srcByteIndex</var> = 0。
  24. 否则, 让 <var>srcByteIndex</var> = <var>srcByteOffset</var>。
  25. 让 <var>targetByteIndex</var> = <var>targetOffset</var> × <var>targetElementSize</var> + <var>targetByteOffset</var>。
  26. 让 <var>limit</var> = <var>targetByteIndex</var> + <var>targetElementSize</var> × <var>srcLength</var>。
  27. 如果 <emu-xref aoid="SameValue">SameValue</emu-xref>(<var>srcType</var>, <var>targetType</var>) 为 <emu-val>false</emu-val>, 那么
    1. 重复, 当 <var>targetByteIndex</var> < <var>limit</var>
      1. 让 <var>value</var> = <emu-xref aoid="GetValueFromBuffer">GetValueFromBuffer</emu-xref>(<var>srcBuffer</var>, <var>srcByteIndex</var>, <var>srcType</var>)。
      2. 执行 <emu-xref aoid="SetValueInBuffer">SetValueInBuffer</emu-xref>(<var>targetBuffer</var>, <var>targetByteIndex</var>, <var>targetType</var>, <var>value</var>)。
      3. 让 <var>srcByteIndex</var> = <var>srcByteIndex</var> + <var>srcElementSize</var>。
      4. 让 <var>targetByteIndex</var> = <var>targetByteIndex</var> + <var>targetElementSize</var>。
  28. 否则,
    1. 注释: 如果 <var>srcType</var> 和 <var>targetType</var> 相同,必须以保留源数据的位级编码的方式执行转移。
    2. 重复, 当 <var>targetByteIndex</var> < <var>limit</var>
      1. 让 <var>value</var> = <emu-xref aoid="GetValueFromBuffer">GetValueFromBuffer</emu-xref>(<var>srcBuffer</var>, <var>srcByteIndex</var>, "Uint8")。
      2. 执行 <emu-xref aoid="SetValueInBuffer">SetValueInBuffer</emu-xref>(<var>targetBuffer</var>, <var>targetByteIndex</var>, "Uint8", <var>value</var>)。
      3. 让 <var>srcByteIndex</var> = <var>srcByteIndex</var> + 1。
      4. 让 <var>targetByteIndex</var> = <var>targetByteIndex</var> + 1。
  29. 返回 <emu-val>undefined</emu-val>。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-%typedarray%.prototype.slice">

22.2.3.24%TypedArray%.prototype.slice ( <var>start</var>, <var>end</var> )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.slice的解释和参数的使用和Array.prototype.slice在<emu-xref href="#sec-array.prototype.slice">22.1.3.23</emu-xref>定义的一样。步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 让 <var>len</var> 等于 <var>O</var> 的内部位置 [[ArrayLength]]。
  4. 让 <var>relativeStart</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>start</var>)。
  5. 如果 <var>relativeStart</var> < 0, 让 <var>k</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeStart</var>), 0); 否则让 <var>k</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeStart</var>, <var>len</var>)。
  6. 如果 <var>end</var> 等于 <emu-val>undefined</emu-val>, 让 <var>relativeEnd</var> = <var>len</var>; 否则让 <var>relativeEnd</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>end</var>)。
  7. 如果 <var>relativeEnd</var> < 0, 让 <var>final</var> = <emu-xref aoid="max">max</emu-xref>((<var>len</var> + <var>relativeEnd</var>), 0); 否则让 <var>final</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeEnd</var>, <var>len</var>)。
  8. 让 <var>count</var> = <emu-xref aoid="max">max</emu-xref>(<var>final</var> - <var>k</var>, 0)。
  9. 让 <var>A</var> = <emu-xref aoid="TypedArraySpeciesCreate">TypedArraySpeciesCreate</emu-xref>(<var>O</var>, « <var>count</var> »)。
  10. 让 <var>srcName</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  11. 让 <var>srcType</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>srcName</var> 的元素类型的字符串值。
  12. 让 <var>targetName</var> 等于 <var>A</var> 的内部位置 [[TypedArrayName]]。
  13. 让 <var>targetType</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>targetName</var> 的元素类型的字符串值。
  14. 如果 <emu-xref aoid="SameValue">SameValue</emu-xref>(<var>srcType</var>, <var>targetType</var>) 为 <emu-val>false</emu-val>, 那么
    1. 让 <var>n</var> = 0。
    2. 重复, 当 <var>k</var> < <var>final</var>
      1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
      2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>O</var>, <var>Pk</var>)。
      3. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>A</var>, <emu-xref aoid="ToString">ToString</emu-xref>(<var>n</var>), <var>kValue</var>, <emu-val>true</emu-val>)。
      4. <var>k</var> 加 1。
      5. <var>n</var> 加 1。
  15. 否则 如果 <var>count</var> > 0, 那么
    1. 让 <var>srcBuffer</var> 等于 <var>O</var> 的内部位置 [[ViewedArrayBuffer]]。
    2. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>srcBuffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    3. 让 <var>targetBuffer</var> 等于 <var>A</var> 的内部位置 [[ViewedArrayBuffer]]。
    4. 让 <var>elementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>srcType</var> 的元素大小的数值。
    5. 注释: 如果 <var>srcType</var> 和 <var>targetType</var> 相等,必须以保留源数据的位级编码的方式执行转移。
    6. 让 <var>srcByteOffet</var> 等于 <var>O</var> 的内部位置 [[ByteOffset]]。
    7. 让 <var>targetByteIndex</var> 等于 <var>A</var> 的内部位置 [[ByteOffset]]。
    8. 让 <var>srcByteIndex</var> = (<var>k</var> × <var>elementSize</var>) + <var>srcByteOffet</var>。
    9. 让 <var>limit</var> = <var>targetByteIndex</var> + <var>count</var> × <var>elementSize</var>。
    10. 重复, 当 <var>targetByteIndex</var> < <var>limit</var>
      1. 让 <var>value</var> = <emu-xref aoid="GetValueFromBuffer">GetValueFromBuffer</emu-xref>(<var>srcBuffer</var>, <var>srcByteIndex</var>, "Uint8")。
      2. 执行 <emu-xref aoid="SetValueInBuffer">SetValueInBuffer</emu-xref>(<var>targetBuffer</var>, <var>targetByteIndex</var>, "Uint8", <var>value</var>)。
      3. <var>srcByteIndex</var> 加 1。
      4. <var>targetByteIndex</var> 加 1。
  16. 返回 <var>A</var>。

</emu-alg>

这个函数不是一般函数,<emu-val>this</emu-val> 必须是一个包含内部位置 [[TypedArrayName]] 的对象。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.some">

22.2.3.25%TypedArray%.prototype.some ( <var>callbackfn</var> [ , <var>thisArg</var> ] )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.some 是一个独特的方法,实现了和 Array.prototype.some 在 <emu-xref href="#sec-array.prototype.some">22.1.3.24</emu-xref> 中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。 这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变,并且必须考虑调用<var>callbackfn</var>方法导致<emu-val>this</emu-val>值变得分离的可能。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.sort">

22.2.3.26%TypedArray%.prototype.sort ( <var>comparefn</var> )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.sort 是一个独特的方法,除了一下所述, 实现是和 Array.prototype.sort 在 <emu-xref href="#sec-array.prototype.sort">22.1.3.25</emu-xref> 中定义的一样。<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.sort 规范的实现是可以被优化的如果知道 <emu-val>this</emu-val> 值是一个对象,有固定长度并且整数下标属性不是稀疏的。这个算法唯一可能调用的内部方法是 [[Get]] 和 [[Set]]。

这个函数不是一般函数,<emu-val>this</emu-val> 必须是一个包含内部位置 [[TypedArrayName]] 的对象。

初始化 sort 函数环境的步骤如下。这些步骤用来替代 <emu-xref href="#sec-array.prototype.sort">22.1.3.25</emu-xref> 中的输入步骤:

<emu-alg>

  1. 让 <var>obj</var> = <emu-val>this</emu-val>。
  2. 让 <var>buffer</var> = <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>obj</var>)。
  3. 让 <var>len</var>等于 <var>obj</var> 的内部位置 [[ArrayLength]]。

</emu-alg>

这个为外来对象定义了排序条件的实现不会被 <emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.sort 应用。

<emu-xref aoid="SortCompare">SortCompare</emu-xref> 的一下版本被用于 <emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.sort。 它执行数值比较而不是使用在<emu-xref href="#sec-array.prototype.sort">22.1.3.25</emu-xref>中的字符串比较。<emu-xref aoid="SortCompare">SortCompare</emu-xref> 能访问到当前调用的 sort 方法的 <var>comparefn</var> 和 <var>buffer</var> 值。

当TypedArray的抽象操作<emu-xref aoid="SortCompare">SortCompare</emu-xref>以两个参数 <var>x</var> 和 <var>y</var> 调用,步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>x</var>) 和 <emu-xref aoid="Type">Type</emu-xref>(<var>y</var>) 都时Number类型。
  2. 如果参数 <var>comparefn</var> 不为 <emu-val>undefined</emu-val>, 那么
    1. 让 <var>v</var> = <emu-xref aoid="Call">Call</emu-xref>(<var>comparefn</var>, <emu-val>undefined</emu-val>, « <var>x</var>, <var>y</var> »)。
    2. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    3. 如果 <var>v</var> 等于 <emu-val>NaN</emu-val>, 返回 <emu-val>+0</emu-val>。
    4. 返回 <var>v</var>。
  3. 如果 <var>x</var> and <var>y</var> are both <emu-val>NaN</emu-val>, 返回 <emu-val>+0</emu-val>。
  4. 如果 <var>x</var> 等于 <emu-val>NaN</emu-val>, 返回 1。
  5. 如果 <var>y</var> 等于 <emu-val>NaN</emu-val>, 返回 -1。
  6. 如果 <var>x</var> < <var>y</var>, 返回 -1。
  7. 如果 <var>x</var> > <var>y</var>, 返回 1。
  8. 如果 <var>x</var> 等于 <emu-val>-0</emu-val> 并且 <var>y</var> 等于 <emu-val>+0</emu-val>, 返回 -1。
  9. 如果 <var>x</var> 等于 <emu-val>+0</emu-val> 并且 <var>y</var> 等于 <emu-val>-0</emu-val>, 返回 1。
  10. 返回 <emu-val>+0</emu-val>。

</emu-alg><emu-note>注释

因为 <emu-val>NaN</emu-val> 始终比其他数值大, 当没有提供<var>comparefn</var>,<emu-val>NaN</emu-val> 始终排在结果的末尾。

</emu-note></emu-clause><emu-clause id="sec-%typedarray%.prototype.subarray">

22.2.3.27%TypedArray%.prototype.subarray( <var>begin</var>, <var>end</var> )#

返回一个新的对象 <var>TypedArray</var>,它的元素类型和这个 <var>TypedArray</var> 一样, 并且它的ArrayBuffer值也是和这个<var>TypedArray</var>的ArrayBuffer一样, 引用<var>begin</var>的元素,包括<var>end</var>。如果<var>begin</var> 或 <var>end</var> 中任意一个为负,它指向数组末尾的下标,作为开始的反面。

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不为 Object, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>O</var> 没有内部位置 [[TypedArrayName]], 抛出<emu-val>TypeError</emu-val>异常。
  4. 断言: <var>O</var> 有内部位置 [[ViewedArrayBuffer]]。
  5. 让 <var>buffer</var> 等于 <var>O</var> 的内部位置 [[ViewedArrayBuffer]]。
  6. 让 <var>srcLength</var> 等于 <var>O</var> 的内部位置 [[ArrayLength]]。
  7. 让 <var>relativeBegin</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>begin</var>)。
  8. 如果 <var>relativeBegin</var> < 0, 让 <var>beginIndex</var> = <emu-xref aoid="max">max</emu-xref>((<var>srcLength</var> + <var>relativeBegin</var>), 0); 否则 让 <var>beginIndex</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeBegin</var>, <var>srcLength</var>)。
  9. 如果 <var>end</var> 等于 <emu-val>undefined</emu-val>, 让 <var>relativeEnd</var> = <var>srcLength</var>; 否则, 让 <var>relativeEnd</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>end</var>)。
  10. 如果 <var>relativeEnd</var> < 0, 让 <var>endIndex</var> = <emu-xref aoid="max">max</emu-xref>((<var>srcLength</var> + <var>relativeEnd</var>), 0); 否则 让 <var>endIndex</var> = <emu-xref aoid="min">min</emu-xref>(<var>relativeEnd</var>, <var>srcLength</var>)。
  11. 让 <var>newLength</var> = <emu-xref aoid="max">max</emu-xref>(<var>endIndex</var> - <var>beginIndex</var>, 0)。
  12. 让 <var>constructorName</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  13. 让 <var>elementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中申明的 <var>constructorName</var> 的元素大小的数值。
  14. 让 <var>srcByteOffset</var> 等于 <var>O</var> 的内部位置 [[ByteOffset]]。
  15. 让 <var>beginByteOffset</var> = <var>srcByteOffset</var> + <var>beginIndex</var> × <var>elementSize</var>。
  16. 让 <var>argumentsList</var> = « <var>buffer</var>, <var>beginByteOffset</var>, <var>newLength</var> »。
  17. 返回 <emu-xref aoid="TypedArraySpeciesCreate">TypedArraySpeciesCreate</emu-xref>(<var>O</var>, <var>argumentsList</var>)。

</emu-alg>

这个函数不是一般函数,<emu-val>this</emu-val> 必须是一个包含内部位置 [[TypedArrayName]] 的对象。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.tolocalestring">

22.2.3.28%TypedArray%.prototype.toLocaleString ([ <var>reserved1</var> [ , <var>reserved2</var> ] ])#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.toLocaleString 是一个独特的方法,实现了和 Array.prototype.toLocaleString 在 <emu-xref href="#sec-array.prototype.tolocalestring">22.1.3.27</emu-xref> 中定义的一样的算法,除了<emu-val>this</emu-val>对象的内部位置 [[ArrayLength]] 的访问代替了"length"的[[Get]]。 这个算法的实现可以被优化,如果知道<emu-val>this</emu-val>的值长度固定并且整数下标属性不是稀疏的。然而,这个优化不能引起算法中明确的行为任何明显的改变。

这个函数不是一般的函数。<emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>在执行算法前就提供了<emu-val>this</emu-val>值。如果结果是<emu-xref href="#sec-completion-record-specification-type">突然的结束</emu-xref>会抛出异常,而不是执行算法。

<emu-note>注释

如果ECMAScript规范包括ECMA-402国际化API,这函数基于ECMA-402规范中Array.prototype.toLocaleString的算法实现。

</emu-note></emu-clause><emu-clause id="sec-%typedarray%.prototype.tostring">

22.2.3.29%TypedArray%.prototype.toString ( )#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.toString 数据属性的初始值和定义在<emu-xref href="#sec-array.prototype.tostring">22.1.3.28</emu-xref>的内建函数对象 Array.prototype.toString 方法一样。

</emu-clause><emu-clause id="sec-%typedarray%.prototype.values">

22.2.3.30%TypedArray%.prototype.values ( )#

步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>O</var>)。
  3. 返回 <emu-xref aoid="CreateArrayIterator">CreateArrayIterator</emu-xref>(<var>O</var>, "value")。

</emu-alg></emu-clause><emu-clause id="sec-%typedarray%.prototype-@@iterator">

22.2.3.31%TypedArray%.prototype [ @@iterator ] ( )#

@@iterator属性的初始值和函数对象<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.prototype.values 的属性的初始值一样。

</emu-clause><emu-clause id="sec-get-%typedarray%.prototype-@@tostringtag">

22.2.3.32get %TypedArray%.prototype [ @@toStringTag ]#

<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>.的属性[@@toStringTag]是一个访问器属性,它的赋值器属性函数是<emu-val>undefined</emu-val>。它的访问器属性函数步骤如下:

<emu-alg>

  1. 让 <var>O</var> = <emu-val>this</emu-val>。
  2. 如果 <emu-xref aoid="Type">Type</emu-xref>(<var>O</var>) 不为 Object, 返回 <emu-val>undefined</emu-val>。
  3. 如果 <var>O</var> 没有内部位置 [[TypedArrayName]], 返回 <emu-val>undefined</emu-val>。
  4. 让 <var>name</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]]。
  5. 断言: <var>name</var> 是一个字符串。
  6. 返回 <var>name</var>。

</emu-alg>

这个属性的特性为 { [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>true</emu-val> }。

这个函数的 name 属性的初始值是"get [Symbol.toStringTag]"

</emu-clause></emu-clause><emu-clause id="sec-typedarray-constructors">

22.2.4<var>TypedArray</var>构造器#

每个<var>TypedArray</var>构造器对象都是固有对象,描述它的结构体如下, 只是在用了构造器名字上与<emu-xref href="#table-49">Table 50</emu-xref>中的<var>TypedArray</var>不同。

固有构造器函数<var>TypedArray</var>是个单函数,它的行为基于参数的个数和类型重载。<var>TypedArray</var>调用的真实行为取决于传递给它的参数的个数和类型。

<var>TypedArray</var>构造器不是被设计来作为一个调用的,以这种方式调用时会抛出异常。

<var>TypedArray</var>构造器是设计来给子类继承的。他们可能被用来作为类定义的extends语句后的值。想要继承<var>TypedArray</var>申明的行为的子类构造器必须包含一个super的调用来创建并初始化一个有内部状态的子类实例, 这样来支持%TypedArray%.prototype上内建的方法。

<var>TypedArray</var>构造器函数的length属性的值为3。

<emu-clause id="sec-typedarray">

22.2.4.1<var>TypedArray</var> ( )#

这个描述仅在<var>TypedArray</var>函数没有参数调用时生效。

<emu-alg>

  1. 如果NewTarget 为 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  2. 让 <var>constructorName</var> 等于<emu-xref href="#table-49">Table 50</emu-xref>表中声明的 <var>TypedArray</var> 构造器的构造器名字的字符串值。
  3. 返回 <emu-xref aoid="AllocateTypedArray">AllocateTypedArray</emu-xref>(<var>constructorName</var>, NewTarget, "%&lt;var&gt;TypedArray&lt;/var&gt;Prototype%", 0)。

</emu-alg></emu-clause><emu-clause id="sec-typedarray-length">

22.2.4.2<var>TypedArray</var> ( <var>length</var> )#

这个描述仅在<var>TypedArray</var>函数以至少一个参数并且第一个参数不是对象的时候生效。

<var>TypedArray</var>以<var>length</var>为参数调用,步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>length</var>) 不是对象。
  2. 如果NewTarget 等于 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  3. 如果 <var>length</var> 等于 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  4. 让 <var>numberLength</var> = <emu-xref aoid="ToNumber">ToNumber</emu-xref>(<var>length</var>)。
  5. 让 <var>elementLength</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<var>numberLength</var>)。
  6. 如果 <emu-xref aoid="SameValueZero">SameValueZero</emu-xref>(<var>numberLength</var>, <var>elementLength</var>) 为 <emu-val>false</emu-val>, 抛出<emu-val>RangeError</emu-val>异常。
  7. 让 <var>constructorName</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中声明的 <var>TypedArray</var> 构造器的构造器名字的字符串值。
  8. 返回 <emu-xref aoid="AllocateTypedArray">AllocateTypedArray</emu-xref>(<var>constructorName</var>, NewTarget, "%&lt;var&gt;TypedArray&lt;/var&gt;Prototype%", <var>elementLength</var>)。

</emu-alg><emu-clause id="sec-allocatetypedarray" aoid="AllocateTypedArray">

22.2.4.2.1执行期语意学: AllocateTypedArray (<var>constructorName</var>, <var>newTarget</var>, <var>defaultProto</var> [ , <var>length</var> ])#

抽象操作AllocateTypedArray以参数<var>constructorName</var>, <var>newTarget</var>, <var>defaultProto</var> 和 可选参数 <var>length</var> 调用来验证和创建一个TypedArray构造器的实例。<var>constructorName</var> 是必需的来作为<emu-xref href="#table-49">Table 50</emu-xref>中的TypedArray构造器的名字。如果<var>length</var>参数传递了一个ArrayBuffer,这个长度也会被分配并且关联到新的TypedArray实例。 AllocateTypedArray提供了通用语义,被用在所有的<var>TypedArray</var>重载集合。AllocateTypedArray调用步骤如下:

<emu-alg>

  1. 让 <var>proto</var> = <emu-xref aoid="GetPrototypeFromConstructor">GetPrototypeFromConstructor</emu-xref>(<var>newTarget</var>, <var>defaultProto</var>)。
  2. 让 <var>obj</var> = <emu-xref aoid="IntegerIndexedObjectCreate">IntegerIndexedObjectCreate</emu-xref>(<var>proto</var>, « [[ViewedArrayBuffer]], [[TypedArrayName]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] »)。
  3. 断言: <var>obj</var>的内部位置[[ViewedArrayBuffer]] 等于 <emu-val>undefined</emu-val>。
  4. 设置 <var>obj</var> 的内部位置 [[TypedArrayName]] 为 <var>constructorName</var>。
  5. 如果没有传递 <var>length</var>, 那么
    1. 设置 <var>obj</var> 的内部位置 [[ByteLength]] 为 0。
    2. 设置 <var>obj</var> 的内部位置 [[ByteOffset]] 为 0。
    3. 设置 <var>obj</var> 的内部位置 [[ArrayLength]] 为 0。
  6. 否则,
    1. 执行 <emu-xref aoid="AllocateTypedArrayBuffer">AllocateTypedArrayBuffer</emu-xref>(<var>obj</var>, <var>length</var>)。
  7. 返回 <var>obj</var>。

</emu-alg></emu-clause><emu-clause id="sec-allocatetypedarraybuffer" aoid="AllocateTypedArrayBuffer">

22.2.4.2.2执行期语意学: AllocateTypedArrayBuffer ( <var>O</var>, <var>length</var> )#

抽象操作AllocateTypedArrayBuffer以参数<var>O</var> 和 <var>length</var> 调用分配并且将ArrayBuffer关联到TypedArray实例 <var>O</var> 上。它的步骤如下:

<emu-alg>

  1. 断言: <var>O</var> 是一个对象并且有内部位置 [[ViewedArrayBuffer]]。
  2. 断言: <var>O</var> 的内部位置 [[ViewedArrayBuffer]] 等于 <emu-val>undefined</emu-val>。
  3. 断言: <var>length</var> ≥ 0。
  4. 让 <var>constructorName</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  5. 让 <var>elementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>constructorName</var> 的元素大小的数值。
  6. 让 <var>byteLength</var> = <var>elementSize</var> × <var>length</var>。
  7. 让 <var>data</var> = <emu-xref aoid="AllocateArrayBuffer">AllocateArrayBuffer</emu-xref>(<emu-xref href="#sec-arraybuffer-constructor">%ArrayBuffer%</emu-xref>, <var>byteLength</var>)。
  8. 设置 <var>O</var> 的内部位置 [[ViewedArrayBuffer]] 为 <var>data</var>。
  9. 设置 <var>O</var> 的内部位置 [[ByteLength]]为 <var>byteLength</var>。
  10. 设置 <var>O</var> 的内部位置 [[ByteOffset]] 为 0。
  11. 设置 <var>O</var> 的内部位置 [[ArrayLength]] 为 <var>length</var>。
  12. 返回 <var>O</var>。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-typedarray-typedarray">

22.2.4.3<var>TypedArray</var> ( <var>typedArray</var> )#

这个描述仅在<var>TypedArray</var>函数以至少一个参数调用并且第一个参数是一个有内部位置[[TypedArrayName]]的对象时生效。

<var>TypedArray</var>以参数<var>typedArray</var>调用时步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>typedArray</var>) 是一个对象并且 <var>typedArray</var> 有内部位置 [[TypedArrayName]]。
  2. 如果 NewTarget 为 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  3. 让 <var>constructorName</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中定义的 <var>TypedArray</var> 构造器的构造器名字的字符串值。
  4. 让 <var>O</var> = <emu-xref aoid="AllocateTypedArray">AllocateTypedArray</emu-xref>(<var>constructorName</var>, NewTarget, "%&lt;var&gt;TypedArray&lt;/var&gt;Prototype%")。
  5. 让 <var>srcArray</var> = <var>typedArray</var>。
  6. 让 <var>srcData</var> 等于 <var>srcArray</var> 的内部位置 [[ViewedArrayBuffer]]。
  7. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>srcData</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  8. 让 <var>constructorName</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  9. 让 <var>elementType</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>constructorName</var> 的元素类型的字符串值。
  10. 让 <var>elementLength</var> 等于 <var>srcArray</var> 的内部位置 [[ArrayLength]] 的值。
  11. 让 <var>srcName</var> 等于<var>srcArray</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  12. 让 <var>srcType</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>srcName</var> 的元素类型的字符串值。
  13. 让 <var>srcElementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>srcName</var> 的元素大小值。
  14. 让 <var>srcByteOffset</var> 等于 <var>srcArray</var> 的内部位置 [[ByteOffset]] 的值。
  15. 让 <var>elementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>constructorName</var> 的元素大小值。
  16. 让 <var>byteLength</var> = <var>elementSize</var> × <var>elementLength</var>。
  17. 如果 <emu-xref aoid="SameValue">SameValue</emu-xref>(<var>elementType</var>, <var>srcType</var>) 为 <emu-val>true</emu-val>, 那么
    1. 让 <var>data</var> = <emu-xref aoid="CloneArrayBuffer">CloneArrayBuffer</emu-xref>(<var>srcData</var>, <var>srcByteOffset</var>)。
  18. 否则,
    1. 让 <var>bufferConstructor</var> = <emu-xref aoid="SpeciesConstructor">SpeciesConstructor</emu-xref>(<var>srcData</var>, <emu-xref href="#sec-arraybuffer-constructor">%ArrayBuffer%</emu-xref>)。
    2. 让 <var>data</var> = <emu-xref aoid="AllocateArrayBuffer">AllocateArrayBuffer</emu-xref>(<var>bufferConstructor</var>, <var>byteLength</var>)。
    3. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>srcData</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
    4. 让 <var>srcByteIndex</var> = <var>srcByteOffset</var>。
    5. 让 <var>targetByteIndex</var> = 0。
    6. 让 <var>count</var> = <var>elementLength</var>。
    7. 重复, 当 <var>count</var> > 0
      1. 让 <var>value</var> = <emu-xref aoid="GetValueFromBuffer">GetValueFromBuffer</emu-xref>(<var>srcData</var>, <var>srcByteIndex</var>, <var>srcType</var>)。
      2. 执行 <emu-xref aoid="SetValueInBuffer">SetValueInBuffer</emu-xref>(<var>data</var>, <var>targetByteIndex</var>, <var>elementType</var>, <var>value</var>)。
      3. 设置 <var>srcByteIndex</var> to <var>srcByteIndex</var> + <var>srcElementSize</var>。
      4. 设置 <var>targetByteIndex</var> to <var>targetByteIndex</var> + <var>elementSize</var>。
      5. <var>count</var> 减 1。
  19. 设置 <var>O</var> 的内部位置 [[ViewedArrayBuffer]] 为 <var>data</var>。
  20. 设置 <var>O</var> 的内部位置 [[ByteLength]] 为 <var>byteLength</var>。
  21. 设置 <var>O</var> 的内部位置 [[ByteOffset]] 为 0。
  22. 设置 <var>O</var> 的内部位置 [[ArrayLength]] 为 <var>elementLength</var>。
  23. 返回 <var>O</var>。

</emu-alg></emu-clause><emu-clause id="sec-typedarray-object">

22.2.4.4<var>TypedArray</var> ( <var>object</var> )#

这个描述仅在<var>TypedArray</var>函数以最少一个参数调用并且第一个参数的类型为没有内部位置[[TypedArrayName]] 或 [[ArrayBufferData]]的对象。

<var>TypedArray</var>以参数<var>object</var>调用,步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>object</var>) 为对象,并且 <var>object</var> 没有内部位置 [[TypedArrayName]] 或 [[ArrayBufferData]]。
  2. 如果NewTarget 为 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  3. 让 <var>constructorName</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中申明的 <var>TypedArray</var> 构造器的构造器名字的字符串值。
  4. 让 <var>O</var> = <emu-xref aoid="AllocateTypedArray">AllocateTypedArray</emu-xref>(<var>constructorName</var>, NewTarget, "%&lt;var&gt;TypedArray&lt;/var&gt;Prototype%")。
  5. 让 <var>arrayLike</var> = <emu-xref aoid="IterableToArrayLike">IterableToArrayLike</emu-xref>(<var>object</var>)。
  6. 让 <var>len</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, "length"))。
  7. 执行 <emu-xref aoid="AllocateTypedArrayBuffer">AllocateTypedArrayBuffer</emu-xref>(<var>O</var>, <var>len</var>)。
  8. 让 <var>k</var> = 0。
  9. 重复, 当 <var>k</var> < <var>len</var>
    1. 让 <var>Pk</var> = <emu-xref aoid="ToString">ToString</emu-xref>(<var>k</var>)。
    2. 让 <var>kValue</var> = <emu-xref aoid="Get">Get</emu-xref>(<var>arrayLike</var>, <var>Pk</var>)。
    3. 执行 <emu-xref aoid="Set">Set</emu-xref>(<var>O</var>, <var>Pk</var>, <var>kValue</var>, <emu-val>true</emu-val>)。
    4. <var>k</var> 加 1。
  10. 返回 <var>O</var>。

</emu-alg></emu-clause><emu-clause id="sec-typedarray-buffer-byteoffset-length">

22.2.4.5<var>TypedArray</var> ( <var>buffer</var> [ , <var>byteOffset</var> [ , <var>length</var> ] ] )#

这个描述只在 <var>TypedArray</var> 函数以最少一个参数调用并且第一个参数是有内部位置 [[ArrayBufferData]] 的对象时生效。

<var>TypedArray</var> 以参数 <var>buffer</var>, <var>byteOffset</var>, 和 <var>length</var>调用,步骤如下:

<emu-alg>

  1. 断言: <emu-xref aoid="Type">Type</emu-xref>(<var>buffer</var>) 为对象,并且<var>buffer</var> 有内部位置 [[ArrayBufferData]]。
  2. 如果 NewTarget 为 <emu-val>undefined</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  3. 让 <var>constructorName</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中定义的 <var>TypedArray</var> 构造器的构造器名字的字符串值。
  4. 让 <var>O</var> = <emu-xref aoid="AllocateTypedArray">AllocateTypedArray</emu-xref>(<var>constructorName</var>, NewTarget, "%&lt;var&gt;TypedArray&lt;/var&gt;Prototype%")。
  5. 让 <var>constructorName</var> 等于 <var>O</var> 的内部位置 [[TypedArrayName]] 的字符串值。
  6. 让 <var>elementSize</var> 等于 <emu-xref href="#table-49">Table 50</emu-xref> 表中的 <var>constructorName</var> 的原始大小的数值。
  7. 让 <var>offset</var> = <emu-xref aoid="ToInteger">ToInteger</emu-xref>(<var>byteOffset</var>)。
  8. 如果 <var>offset</var> < 0, 抛出<emu-val>RangeError</emu-val>异常。
  9. 如果 <var>offset</var> 等于 <emu-val>-0</emu-val>, 让 <var>offset</var> = <emu-val>+0</emu-val>。
  10. 如果 <var>offset</var> 的<emu-xref aoid="modulo"></emu-xref> <var>elementSize</var> ≠ 0, 抛出<emu-val>RangeError</emu-val>异常。
  11. 如果 <emu-xref aoid="IsDetachedBuffer">IsDetachedBuffer</emu-xref>(<var>buffer</var>) 为 <emu-val>true</emu-val>, 抛出<emu-val>TypeError</emu-val>异常。
  12. 让 <var>bufferByteLength</var> 等于 <var>buffer</var> 的内部位置 [[ArrayBufferByteLength]]。
  13. 如果 <var>length</var> 等于 <emu-val>undefined</emu-val>, 那么
    1. 如果 <var>bufferByteLength</var> 的<emu-xref aoid="modulo"></emu-xref> <var>elementSize</var> ≠ 0, 抛出<emu-val>RangeError</emu-val>异常。
    2. 让 <var>newByteLength</var> = <var>bufferByteLength</var> - <var>offset</var>。
    3. 如果 <var>newByteLength</var> < 0, 抛出<emu-val>RangeError</emu-val>异常。
  14. 否则,
    1. 让 <var>newLength</var> = <emu-xref aoid="ToLength">ToLength</emu-xref>(<var>length</var>)。
    2. 让 <var>newByteLength</var> = <var>newLength</var> × <var>elementSize</var>。
    3. 如果 <var>offset</var>+<var>newByteLength</var> > <var>bufferByteLength</var>, 抛出<emu-val>RangeError</emu-val>异常。
  15. 设置 <var>O</var> 的内部位置 [[ViewedArrayBuffer]] 为 <var>buffer</var>。
  16. 设置 <var>O</var> 的内部位置 [[ByteLength]] 为 <var>newByteLength</var>。
  17. 设置 <var>O</var> 的内部位置 [[ByteOffset]] 为 <var>offset</var>。
  18. 设置 <var>O</var> 的内部位置 [[ArrayLength]] 为 <var>newByteLength</var> / <var>elementSize</var>。
  19. 返回 <var>O</var>。

</emu-alg></emu-clause><emu-clause id="typedarray-create" aoid="TypedArrayCreate">

22.2.4.6TypedArrayCreate ( <var>constructor</var>, <var>argumentList</var> )#

抽象操作 TypedArrayCreate 以参数 <var>constructor</var> 和 <var>argumentList</var> 调用通过使用构造器函数来声明新的TypedArray对象的创建。 步骤如下:

<emu-alg>

  1. 让 <var>newTypedArray</var> = <emu-xref aoid="Construct">Construct</emu-xref>(<var>constructor</var>, <var>argumentList</var>)。
  2. 执行 <emu-xref aoid="ValidateTypedArray">ValidateTypedArray</emu-xref>(<var>newTypedArray</var>)。
  3. 如果 <var>argumentList</var> 是一个单个数字的 <emu-xref href="#sec-list-and-record-specification-type">列表</emu-xref>, 那么
    1. 如果 <var>newTypedArray</var> 的内部位置 [[ArrayLength]] 的值 小于 <var>argumentList</var>[0], 抛出<emu-val>TypeError</emu-val>异常。
  4. 返回 <var>newTypedArray</var>。

</emu-alg></emu-clause><emu-clause id="typedarray-species-create" aoid="TypedArraySpeciesCreate">

22.2.4.7TypedArraySpeciesCreate ( <var>exemplar</var>, <var>argumentList</var> )#

抽象操作TypedArraySpeciesCreate以参数 <var>exemplar</var> 和 <var>argumentList</var> 调用通过使用从<var>exemplar</var>派生的构造器函数来声明新的TypedArray对象的创建。步骤如下:

<emu-alg>

  1. 断言: <var>exemplar</var> 为一个有内部位置 [[TypedArrayName]] 的对象。
  2. 让 <var>defaultConstructor</var> 为固有对象,<emu-xref href="#table-49">Table 50</emu-xref> 表中第一个列的 <var>exemplar</var> 的内部位置 [[TypedArrayName]]。
  3. 让 <var>constructor</var> = <emu-xref aoid="SpeciesConstructor">SpeciesConstructor</emu-xref>(<var>exemplar</var>, <var>defaultConstructor</var>)。
  4. 返回 <emu-xref aoid="TypedArrayCreate">TypedArrayCreate</emu-xref>(<var>constructor</var>, <var>argumentList</var>)。

</emu-alg></emu-clause></emu-clause><emu-clause id="sec-properties-of-the-typedarray-constructors">

22.2.5<var>TypedArray</var>的属性构造器#

每个<var>TypedArray</var>构造器的内部位置 [[Prototype]]都是固有对象<emu-xref href="#sec-%typedarray%-intrinsic-object">%TypedArray%</emu-xref>。

每个有name属性的<var>TypedArray</var>构造器的值都是 <emu-xref href="#table-49">Table 50</emu-xref>表中声明的构造器名字的字符串值。

每个 <var>TypedArray</var> 构造器都有以下属性:

<emu-clause id="sec-typedarray.bytes_per_element">

22.2.5.1<var>TypedArray</var>.BYTES_PER_ELEMENT#

<var>TypedArray</var>.BYTES_PER_ELEMENT 的值是<emu-xref href="#table-49">Table 50</emu-xref> 表中申明的 <var>TypedArray</var> 的元素大小的数字。

这个属性的特性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

</emu-clause><emu-clause id="sec-typedarray.prototype">

22.2.5.2<var>TypedArray</var>.prototype#

<var>TypedArray</var>.prototype 的初始值是(<emu-xref href="#sec-properties-of-typedarray-prototype-objects">22.2.6</emu-xref>)表中相应的<var>TypedArray</var>的固有原型对象。

这个属性的特性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

</emu-clause></emu-clause><emu-clause id="sec-properties-of-typedarray-prototype-objects">

22.2.6Properties of <var>TypedArray</var> Prototype Objects#

<var>TypedArray</var>原型对象上的内部位置[[Prototype]]是固有对象<emu-xref href="#sec-properties-of-the-%typedarrayprototype%-object">%TypedArrayPrototype%</emu-xref>。 <var>TypedArray</var> 原型对象是一个普通对象。它没有[[ViewedArrayBuffer]] 或者其他内部位置申明在 <var>TypedArray</var> 实例对象上。

<emu-clause id="sec-typedarray.prototype.bytes_per_element">

22.2.6.1<var>TypedArray</var>.prototype.BYTES_PER_ELEMENT#

&lt;var&gt;TypedArray&lt;/var&gt;.prototype.BYTES_PER_ELEMENT的值是 <emu-xref href="#table-49">Table 50</emu-xref> 表中申明的 <var>TypedArray</var> 的元素大小的数值。

这个属性的特性为 { [[Writable]]: <emu-val>false</emu-val>, [[Enumerable]]: <emu-val>false</emu-val>, [[Configurable]]: <emu-val>false</emu-val> }。

</emu-clause><emu-clause id="sec-typedarray.prototype.constructor">

22.2.6.2<var>TypedArray</var>.prototype.constructor#

&lt;var&gt;TypedArray&lt;/var&gt;.prototype.constructor的初始值是相应的固有对象 %<var>TypedArray</var>%。

</emu-clause></emu-clause><emu-clause id="sec-properties-of-typedarray-instances">

22.2.7<var>TypedArray</var>实例的属性#

<var>TypedArray</var>实例是整数下标的外来对象。每个<var>TypedArray</var>实例从相应的<var>TypedArray</var>原型对象上继承属性。每个<var>TypedArray</var>实例有以下内部位置:[[TypedArrayName]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]], 和 [[ArrayLength]]。

</emu-clause></emu-clause>

相关文章