23 索引集合(Indexed Collections)

23.1 Array 对象

Array 是一种对某类属性名进行特殊处理的异质(exotic)对象。该特殊处理的定义见 10.4.2

23.1.1 Array 构造函数

Array 构造函数

  • %Array%
  • 是全局对象 "Array" 属性的初始值。
  • 作为构造函数调用时创建并初始化一个新的 Array。
  • 作为函数(而非构造函数)调用时同样创建并初始化一个新的 Array。因此函数调用 Array(…) 等价于使用相同参数的对象创建表达式 new Array(…)
  • 其行为随参数数量与类型不同而不同。
  • 可用作类定义 extends 子句的值。打算继承数组异质行为的子类构造函数必须包含对 Array 构造函数super 调用,以初始化作为数组异质对象的子类实例。但大多数 Array.prototype 方法是泛型的,不依赖其 this 为数组异质对象。

23.1.1.1 Array ( ...values )

此函数被调用时执行以下步骤:

  1. 若 NewTarget 为 undefined,令 newTarget 为活动函数对象;否则令 newTarget 为 NewTarget。
  2. proto 为 ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")。
  3. numberOfArgsvalues 中元素的数量。
  4. numberOfArgs = 0,则
    1. 返回 ! ArrayCreate(0, proto)。
  5. 否则若 numberOfArgs = 1,则
    1. lenvalues[0]。
    2. array 为 ! ArrayCreate(0, proto)。
    3. len 不是 Number,则
      1. 执行 ! CreateDataPropertyOrThrow(array, "0", len)。
      2. intLen1𝔽
    4. 否则,
      1. intLen 为 ! ToUint32(len)。
      2. SameValueZero(intLen, len) 为 false,抛出 RangeError 异常。
    5. 执行 ! Set(array, "length", intLen, true)。
    6. 返回 array
  6. 否则,
    1. 断言:numberOfArgs ≥ 2。
    2. array 为 ? ArrayCreate(numberOfArgs, proto)。
    3. k 为 0。
    4. k < numberOfArgs 时重复,
      1. Pk 为 ! ToString(𝔽(k))。
      2. itemKvalues[k]。
      3. 执行 ! CreateDataPropertyOrThrow(array, Pk, itemK)。
      4. k = k + 1。
    5. 断言:array"length" 属性数学值numberOfArgs
    6. 返回 array

23.1.2 Array 构造函数的属性

Array 构造函数

  • 具有 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • 具有 "length" 属性,其值为 1𝔽
  • 具有以下属性:

23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )

此方法被调用时执行以下步骤:

  1. Cthis 值。
  2. mapperundefined,则
    1. mappingfalse
  3. 否则,
    1. IsCallable(mapper) 为 false,抛出 TypeError 异常。
    2. mappingtrue
  4. usingIterator 为 ? GetMethod(items, %Symbol.iterator%)。
  5. usingIterator 不为 undefined,则
    1. IsConstructor(C) 为 true,则
      1. A 为 ? Construct(C)。
    2. 否则,
      1. A 为 ! ArrayCreate(0)。
    3. iteratorRecord 为 ? GetIteratorFromMethod(items, usingIterator)。
    4. k 为 0。
    5. 重复,
      1. k ≥ 253 - 1,则
        1. errorThrowCompletion(新建的 TypeError 对象)。
        2. 返回 ? IteratorClose(iteratorRecord, error)。
      2. Pk 为 ! ToString(𝔽(k))。
      3. next 为 ? IteratorStepValue(iteratorRecord)。
      4. nextdone,则
        1. 执行 ? Set(A, "length", 𝔽(k), true)。
        2. 返回 A
      5. mappingtrue,则
        1. mappedValueCompletion(Call(mapper, thisArg, « next, 𝔽(k) »))。
        2. IfAbruptCloseIterator(mappedValue, iteratorRecord)。
      6. 否则,
        1. mappedValuenext
      7. defineStatusCompletion(CreateDataPropertyOrThrow(A, Pk, mappedValue))。
      8. IfAbruptCloseIterator(defineStatus, iteratorRecord)。
      9. k = k + 1。
  6. 注:items 不可迭代,假定为类数组对象
  7. arrayLike 为 ! ToObject(items)。
  8. len 为 ? LengthOfArrayLike(arrayLike)。
  9. IsConstructor(C) 为 true,则
    1. A 为 ? Construct(C, « 𝔽(len) »)。
  10. 否则,
    1. A 为 ? ArrayCreate(len)。
  11. k 为 0。
  12. k < len 时重复,
    1. Pk 为 ! ToString(𝔽(k))。
    2. kValue 为 ? Get(arrayLike, Pk)。
    3. mappingtrue,则
      1. mappedValue 为 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)。
    4. 否则,
      1. mappedValuekValue
    5. 执行 ? CreateDataPropertyOrThrow(A, Pk, mappedValue)。
    6. k = k + 1。
  13. 执行 ? Set(A, "length", 𝔽(len), true)。
  14. 返回 A
Note

此方法是刻意设计的通用工厂方法;其 this 不必为 Array 构造函数,因此可被其他可用单个数值参数调用的构造函数继承或转移使用。

23.1.2.2 Array.isArray ( arg )

此函数被调用时执行以下步骤:

  1. 返回 ? IsArray(arg)。

23.1.2.3 Array.of ( ...items )

此方法被调用时执行以下步骤:

  1. lenitems 中元素数量。
  2. lenNumber𝔽(len)。
  3. Cthis 值。
  4. IsConstructor(C) 为 true,则
    1. A 为 ? Construct(C, « lenNumber »)。
  5. 否则,
    1. A 为 ? ArrayCreate(len)。
  6. k 为 0。
  7. k < len 时重复,
    1. kValueitems[k]。
    2. Pk 为 ! ToString(𝔽(k))。
    3. 执行 ? CreateDataPropertyOrThrow(A, Pk, kValue)。
    4. k = k + 1。
  8. 执行 ? Set(A, "length", lenNumber, true)。
  9. 返回 A
Note

此方法是刻意设计的通用工厂方法;其 this 不必为 Array 构造函数,因此可被其它构造函数继承或转移使用。

23.1.2.4 Array.prototype

Array.prototype 的值是 Array 原型对象

该属性具有 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.1.2.5 get Array [ %Symbol.species% ]

Array[%Symbol.species%] 是一个存取器属性,其 set 访问器为 undefined。其 get 访问器被调用时执行:

  1. 返回 this 值。

该函数 "name" 属性值为 "get [Symbol.species]"

Note

Array 原型方法通常使用其 this构造函数来创建派生对象;子类可通过重定义 %Symbol.species% 覆盖该默认行为。

23.1.3 Array 原型对象的属性

Array 原型对象

  • %Array.prototype%
  • 是一个 Array 异质对象,具有该类对象规定的内部方法。
  • "length" 属性,其初始值为 +0𝔽,属性特性为 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。
  • 具有 [[Prototype]] 内部槽,其值为 %Object.prototype%
Note

指定为数组异质对象以保持与 ECMAScript 2015 之前代码的兼容性。

23.1.3.1 Array.prototype.at ( index )

  1. O 为 ? ToObject(this value)。
  2. len 为 ? LengthOfArrayLike(O)。
  3. relativeIndex 为 ? ToIntegerOrInfinity(index)。
  4. relativeIndex ≥ 0,则
    1. k = relativeIndex
  5. 否则,
    1. k = len + relativeIndex
  6. k < 0 或 klen,返回 undefined
  7. 返回 ? Get(O, ! ToString(𝔽(k)))。

23.1.3.2 Array.prototype.concat ( ...items )

返回一个数组,包含对象自身元素后接各参数的数组元素。

调用时执行:

  1. O 为 ? ToObject(this value)。
  2. A 为 ? ArraySpeciesCreate(O, 0)。
  3. n = 0。
  4. O 前置到 items
  5. items 中每个元素 E
    1. spreadable 为 ? IsConcatSpreadable(E)。
    2. spreadabletrue
      1. len 为 ? LengthOfArrayLike(E)。
      2. n + len > 253 - 1,抛出 TypeError
      3. k = 0。
      4. k < len
        1. Pk 为 ! ToString(𝔽(k))。
        2. exists 为 ? HasProperty(E, Pk)。
        3. existstrue
          1. subElement 为 ? Get(E, Pk)。
          2. 执行 ? CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), subElement)。
        4. n = n + 1。
        5. k = k + 1。
    3. 否则,
      1. 注:E 作为单个元素添加。
      2. n ≥ 253 - 1,抛出 TypeError
      3. 执行 ? CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), E)。
      4. n = n + 1。
  6. 执行 ? Set(A, "length", 𝔽(n), true)。
  7. 返回 A

此方法 "length" 属性为 1𝔽

Note 1

显式设置 "length"(参见 6)以确保尾部存在空洞或 A 不是内置数组时长度正确。

Note 2

本方法为泛型;this 不要求是 Array,可转移给其他对象使用。

23.1.3.2.1 IsConcatSpreadable ( O )

The abstract operation IsConcatSpreadable takes argument O (an ECMAScript language value) and returns 包含布尔值的正常完成或抛出完成. It performs the following steps when called:

  1. O 不是对象,返回 false
  2. spreadable 为 ? Get(O, %Symbol.isConcatSpreadable%)。
  3. spreadable 不为 undefined,返回 ToBoolean(spreadable)。
  4. 返回 ? IsArray(O)。

23.1.3.3 Array.prototype.constructor

Array.prototype.constructor 的初始值为 %Array%

23.1.3.4 Array.prototype.copyWithin ( target, start [ , end ] )

Note 1

end 可选;缺省使用 this 的长度。

Note 2

负的 target / start / end 分别视为 length + 参数

调用时执行:

  1. O 为 ? ToObject(this value)。
  2. len 为 ? LengthOfArrayLike(O)。
  3. relativeTarget 为 ? ToIntegerOrInfinity(target)。
  4. relativeTarget = -∞,令 to = 0。
  5. 否则若 relativeTarget < 0,令 to = max(len + relativeTarget, 0)。
  6. 否则令 to = min(relativeTarget, len)。
  7. relativeStart 为 ? ToIntegerOrInfinity(start)。
  8. relativeStart = -∞,令 from = 0。
  9. 否则若 relativeStart < 0,令 from = max(len + relativeStart, 0)。
  10. 否则令 from = min(relativeStart, len)。
  11. endundefined,令 relativeEnd = len;否则令 relativeEnd = ? ToIntegerOrInfinity(end)。
  12. relativeEnd = -∞,令 final = 0。
  13. 否则若 relativeEnd < 0,令 final = max(len + relativeEnd, 0)。
  14. 否则令 final = min(relativeEnd, len)。
  15. count = min(final - from, len - to)。
  16. from < toto < from + count,则
    1. direction = -1。
    2. from = from + count - 1。
    3. to = to + count - 1。
  17. 否则令 direction = 1。
  18. count > 0:
    1. fromKey = ! ToString(𝔽(from))。
    2. toKey = ! ToString(𝔽(to))。
    3. fromPresent = ? HasProperty(O, fromKey)。
    4. fromPresenttrue
      1. fromValue = ? Get(O, fromKey)。
      2. 执行 ? Set(O, toKey, fromValue, true)。
    5. 否则
      1. 执行 ? DeletePropertyOrThrow(O, toKey)。
    6. from += direction
    7. to += direction
    8. count -= 1。
  19. 返回 O
Note 3

方法为泛型,可转移到其它对象。

23.1.3.5 Array.prototype.entries ( )

调用时执行:

  1. O 为 ? ToObject(this value)。
  2. 返回 CreateArrayIterator(O, key+value)。

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )

Note 1

依次(升序)对存在的元素调用 callback,若遇到返回 false 的元素立即返回 false;否则返回 true。空数组结果为 true

执行步骤:

  1. O 为 ? ToObject(this value)。
  2. len 为 ? LengthOfArrayLike(O)。
  3. IsCallable(callback) 为 false,抛出 TypeError
  4. k = 0。
  5. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. testResultfalse,返回 false
    4. k = k + 1。
  6. 返回 true
Note 2

泛型方法,可转移使用。

23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )

Note 1

start 缺省 +0𝔽end 缺省为长度;负值按长度偏移。

执行步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. relativeStart = ? ToIntegerOrInfinity(start)。
  4. relativeStart = -∞,k = 0;否则若 < 0,k = max(len + relativeStart, 0);否则 k = min(relativeStart, len)。
  5. endundefinedrelativeEnd = len;否则 relativeEnd = ? ToIntegerOrInfinity(end)。
  6. relativeEnd = -∞,final = 0;否则若 < 0,final = max(len + relativeEnd, 0);否则 final = min(relativeEnd, len)。
  7. k < final
    1. Pk = ! ToString(𝔽(k))。
    2. Set(O, Pk, value, true)。
    3. k++。
  8. 返回 O
Note 2

泛型方法。

23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )

Note 1

对现有元素调用 callback,收集返回 true 的值构成新数组。

执行步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. IsCallable(callback) 为 falseTypeError
  4. A = ? ArraySpeciesCreate(O, 0)。
  5. k = 0;to = 0。
  6. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. selected = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. selected
        1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(to)), kValue)。
        2. to++。
    4. k++。
  7. 返回 A
Note 2

泛型。

23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )

Note 1

升序查找首个使 predicate 结果为真值的元素,找不到返回 undefined

执行步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. findRec = ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  4. 返回 findRec.[[Value]]
Note 2

泛型。

23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )

Note 1

升序查找首个满足谓词的索引,未找到返回 -1。

执行:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. findRec = ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  4. 返回 findRec.[[Index]]
Note 2

泛型。

23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )

Note 1

降序查找首个满足谓词的元素,未找到返回 undefined

执行:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. findRec = ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  4. 返回 findRec.[[Value]]
Note 2

泛型。

23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )

Note 1

降序查找首个满足谓词的索引,未找到返回 -1。

执行:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. findRec = ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  4. 返回 findRec.[[Index]]
Note 2

泛型。

23.1.3.12.1 FindViaPredicate ( O, len, direction, predicate, thisArg )

The abstract operation FindViaPredicate takes arguments O (an Object), len (a non-negative integer), direction (ascending or descending), predicate (an ECMAScript language value), and thisArg (an ECMAScript language value) and returns 返回含 [[Index]][[Value]] 字段的记录或抛出完成.

遍历 O 的索引(升序或降序)调用 predicate,返回首个真值对应的索引与值;若无则索引 -1𝔽,值 undefined

predicate 接收 (元素值, 索引, 被遍历对象)。

thisArg 作为 this 使用。

不直接修改 Opredicate 可修改。

遍历范围在开始前确定;新增元素不访问;修改元素按访问时值;删除后再访问的仍按原序列访问(TypedArray 特例除外按语义)。

It performs the following steps when called:

  1. IsCallable(predicate) 为 falseTypeError
  2. directionascending
    1. indices 为 [0, …, len-1] 升序列表。
  3. 否则,
    1. indices 为 [0, …, len-1] 降序列表。
  4. indices 中每个整数 k
    1. Pk = ! ToString(𝔽(k))。
    2. 注:若 OTypedArray,调用 Get正常完成
    3. kValue = ? Get(O, Pk)。
    4. testResult = ? Call(predicate, thisArg, « kValue, 𝔽(k), O »)。
    5. ToBoolean(testResult) 为 true,返回 { [[Index]]: 𝔽(k), [[Value]]: kValue }。
  5. 返回 { [[Index]]: -1𝔽, [[Value]]: undefined }。

23.1.3.13 Array.prototype.flat ( [ depth ] )

调用时执行:

  1. O = ? ToObject(this value)。
  2. sourceLen = ? LengthOfArrayLike(O)。
  3. depthNum = 1。
  4. depthundefined
    1. depthNum = ? ToIntegerOrInfinity(depth)。
    2. depthNum < 0,设为 0。
  5. A = ? ArraySpeciesCreate(O, 0)。
  6. ? FlattenIntoArray(A, O, sourceLen, 0, depthNum)。
  7. 返回 A

23.1.3.13.1 FlattenIntoArray ( target: an Object, source: an Object, sourceLen: a non-negative integer, start: a non-negative integer, depth: a non-negative integer or +∞, optional mapperFunction: a function object, optional thisArg: an ECMAScript language value, ): either a normal completion containing a non-negative integer or a throw completion

  1. 断言:若提供 mapperFunction,则 IsCallable(mapperFunction) 为 truethisArg 存在且 depth = 1。
  2. targetIndex = start
  3. sourceIndex = +0𝔽
  4. (sourceIndex) < sourceLen
    1. P = ! ToString(sourceIndex)。
    2. exists = ? HasProperty(source, P)。
    3. exists
      1. element = ? Get(source, P)。
      2. 若有 mapperFunctionelement = ? Call(mapperFunction, thisArg, « element, sourceIndex, source »)。
      3. shouldFlatten = false
      4. depth > 0:shouldFlatten = ? IsArray(element)。
      5. shouldFlatten
        1. depth = +∞,newDepth = +∞;否则 newDepth = depth - 1。
        2. elementLen = ? LengthOfArrayLike(element)。
        3. targetIndex = ? FlattenIntoArray(target, element, elementLen, targetIndex, newDepth)。
      6. 否则:
        1. targetIndex ≥ 253 - 1 抛 TypeError
        2. CreateDataPropertyOrThrow(target, ! ToString(𝔽(targetIndex)), element)。
        3. targetIndex++。
    4. sourceIndex += 1𝔽
  5. 返回 targetIndex

23.1.3.14 Array.prototype.flatMap ( mapperFunction [ , thisArg ] )

执行步骤:

  1. O = ? ToObject(this value)。
  2. sourceLen = ? LengthOfArrayLike(O)。
  3. IsCallable(mapperFunction) 为 falseTypeError
  4. A = ? ArraySpeciesCreate(O, 0)。
  5. ? FlattenIntoArray(A, O, sourceLen, 0, 1, mapperFunction, thisArg)。
  6. 返回 A

23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )

Note 1

对存在元素升序调用 callback,不返回聚合值,缺失元素略过。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. IsCallable(callback) 为 falseTypeError
  4. k = 0。
  5. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. k++。
  6. 返回 undefined
Note 2

泛型。

23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )

Note 1

使用 SameValueZero 比较,找到即返回 true,未找到 false;不跳过空洞(空洞按 undefined)。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. len = 0 返回 false
  4. n = ? ToIntegerOrInfinity(fromIndex)。
  5. 断言:若 fromIndexundefinedn = 0。
  6. n = +∞ 返回 false;若 n = -∞ 令 n = 0。
  7. n ≥ 0:k = n;否则 k = len + n,若 k < 0 则 k = 0。
  8. k < len
    1. elementK = ? Get(O, ! ToString(𝔽(k)))。
    2. SameValueZero(searchElement, elementK) 为 true 返回 true
    3. k++。
  9. 返回 false
Note 2

泛型。

Note 3

区别于 indexOf:使用 SameValueZero 并且不跳过空洞。

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

使用 IsStrictlyEqual 升序查找首个匹配索引,未找到返回 -1𝔽(跳过空洞)。

Note 1

fromIndex 缺省 +0𝔽;可为负表示从末尾偏移。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. len = 0 返回 -1𝔽
  4. n = ? ToIntegerOrInfinity(fromIndex)。
  5. 断言:fromIndexundefinedn = 0。
  6. n = +∞ 返回 -1𝔽;若 n = -∞ 置 0。
  7. n ≥ 0:k = n;否则 k = len + n,若 k < 0 则 0。
  8. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. elementK = ? Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) 为 true 返回 𝔽(k)。
    4. k++。
  9. 返回 -1𝔽
Note 2

泛型。

23.1.3.18 Array.prototype.join ( separator )

将元素转换为字符串并用分隔符拼接;缺省分隔符为逗号。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. separatorundefinedsep = ",";否则 sep = ? ToString(separator)。
  4. R = 空字符串;k = 0。
  5. k < len
    1. k > 0,R = R + sep
    2. element = ? Get(O, ! ToString(𝔽(k)))。
    3. element 既非 undefined 亦非 null
      1. S = ? ToString(element)。
      2. R = R + S
    4. k++。
  6. 返回 R
Note

泛型。

23.1.3.19 Array.prototype.keys ( )

步骤:

  1. O = ? ToObject(this value)。
  2. 返回 CreateArrayIterator(O, key)。

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

Note 1

自右向左使用 IsStrictlyEqual 查找,返回最大匹配索引,否则 -1。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. len = 0 返回 -1𝔽
  4. 若提供 fromIndexn = ? ToIntegerOrInfinity(fromIndex);否则 n = len - 1。
  5. n = -∞ 返回 -1𝔽
  6. n ≥ 0:k = min(n, len - 1);否则 k = len + n
  7. k ≥ 0:
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. elementK = ? Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) 为 true 返回 𝔽(k)。
    4. k--。
  8. 返回 -1𝔽
Note 2

泛型。

23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )

Note 1

升序对存在元素调用 callback,生成新数组。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. IsCallable(callback) 为 falseTypeError
  4. A = ? ArraySpeciesCreate(O, len)。
  5. k = 0。
  6. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. mappedValue = ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
      3. CreateDataPropertyOrThrow(A, Pk, mappedValue)。
    4. k++。
  7. 返回 A
Note 2

泛型。

23.1.3.22 Array.prototype.pop ( )

Note 1

移除并返回最后一个元素。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. len = 0:
    1. Set(O, "length", +0𝔽, true)。
    2. 返回 undefined
  4. 否则:
    1. newLen = 𝔽(len - 1)。
    2. index = ! ToString(newLen)。
    3. element = ? Get(O, index)。
    4. DeletePropertyOrThrow(O, index)。
    5. Set(O, "length", newLen, true)。
    6. 返回 element
Note 2

泛型。

23.1.3.23 Array.prototype.push ( ...items )

Note 1

将参数按顺序追加到末尾,返回新长度。

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. argCount = items 长度。
  4. len + argCount > 253 - 1 抛 TypeError
  5. 对每个 E 属于 items
    1. Set(O, ! ToString(𝔽(len)), E, true)。
    2. len++。
  6. Set(O, "length", 𝔽(len), true)。
  7. 返回 𝔽(len)。

此方法 "length" 属性为 1𝔽

Note 2

泛型。

23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )

Note 1

从左到右归约;若未提供 initialValue,使用首个存在元素作为累加器起始;空数组且无初始值抛 TypeError

步骤:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. IsCallable(callback) 为 falseTypeError
  4. len = 0 且无 initialValueTypeError
  5. k = 0;accumulator = undefined
  6. 若提供 initialValueaccumulator = initialValue
  7. 否则:
    1. kPresent = false
    2. 当 !kPresentk < len
      1. Pk = ! ToString(𝔽(k))。
      2. kPresent = ? HasProperty(O, Pk)。
      3. kPresentaccumulator = ? Get(O, Pk)。
      4. k++。
    3. 若 !kPresentTypeError
  8. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k++。
  9. 返回 accumulator
Note 2

泛型。

23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )

Note 1

从右向左归约,规则同 reduce 但方向相反。

步骤:

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. IsCallable(callback) 为 falseTypeError
  3. len = 0 且无 initialValueTypeError
  4. k = len - 1;accumulator = undefined
  5. 若有初始值:accumulator = initialValue
  6. 否则:
    1. kPresent = false
    2. 当 !kPresentk ≥ 0:
      1. Pk = ! ToString(𝔽(k))。
      2. kPresent = ? HasProperty(O, Pk)。
      3. kPresentaccumulator = ? Get(O, Pk)。
      4. k--。
    3. 若 !kPresentTypeError
  7. k ≥ 0:
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresent
      1. kValue = ? Get(O, Pk)。
      2. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k--。
  8. 返回 accumulator
Note 2

泛型。

23.1.3.26 Array.prototype.reverse ( )

Note 1

就地反转顺序并返回该对象。

步骤:

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. middle = floor(len/2),lower = 0。
  3. lowermiddle
    1. upper = len - lower - 1。
    2. upperP = ! ToString(𝔽(upper)),lowerP = ! ToString(𝔽(lower))。
    3. lowerExists = ? HasProperty(O, lowerP);若真:lowerValue = ? Get(O, lowerP)。
    4. upperExists = ? HasProperty(O, upperP);若真:upperValue = ? Get(O, upperP)。
    5. 若二者皆真:交换;仅上真:下设上并删上;仅下真:删下并设上;皆假:无操作。
    6. lower++。
  4. 返回 O
Note 2

泛型。

23.1.3.27 Array.prototype.shift ( )

移除首元素并返回。

步骤:

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. len = 0:? Set(O, "length", +0𝔽, true);返回 undefined
  3. first = ? Get(O, "0")。
  4. k = 1。
  5. k < len
    1. from = ! ToString(𝔽(k)),to = ! ToString(𝔽(k-1))。
    2. fromPresent = ? HasProperty(O, from)。
    3. 若真:fromValue = ? Get(O, from);? Set(O, to, fromValue, true);否则 Delete to
    4. k++。
  6. DeletePropertyOrThrow(O, ! ToString(𝔽(len-1)))。
  7. Set(O, "length", 𝔽(len-1), true)。
  8. 返回 first
Note

泛型。

23.1.3.28 Array.prototype.slice ( start, end )

返回从 start(含)到 end(不含)之间的浅拷贝;负值按长度偏移。

步骤:

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. relativeStart = ? ToIntegerOrInfinity(start)。
  3. 若 = -∞,k = 0;否则若 <0,k = max(len+relativeStart,0);否则 k = min(relativeStart, len)。
  4. relativeEnd = (endundefinedlen : ? ToIntegerOrInfinity(end))。
  5. relativeEnd = -∞,final = 0;若 <0,final = max(len+relativeEnd,0);否则 final = min(relativeEnd, len)。
  6. count = max(final - k, 0)。
  7. A = ? ArraySpeciesCreate(O, count)。
  8. n = 0。
  9. k < final
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. 若真:kValue = ? Get(O, Pk);? CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), kValue)。
    4. k++;n++。
  10. Set(A, "length", 𝔽(n), true)。
  11. 返回 A
Note 1

显式设置长度确保非内置数组时正确。

Note 2

泛型。

23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )

Note 1

升序测试是否存在使 callback 为真值的元素;空数组返回 false

步骤:

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. IsCallable(callback) 为 falseTypeError
  3. k = 0。
  4. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. 若真:
      1. kValue = ? Get(O, Pk)。
      2. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. testResulttrue 返回 true
    4. k++。
  5. 返回 false
Note 2

泛型。

23.1.3.30 Array.prototype.sort ( comparator )

对数组元素排序;若提供 comparator,必须可调用并按返回值符号决定顺序。

步骤:

  1. comparatorundefined 且不可调用,抛 TypeError
  2. obj = ? ToObject(this value)。
  3. len = ? LengthOfArrayLike(obj)。
  4. SortCompare = 抽象闭包(x, y):? CompareArrayElements(x, y, comparator)。
  5. sortedList = ? SortIndexedProperties(obj, len, SortCompare, skip-holes)。
  6. itemCount = sortedList 长度。
  7. j = 0。
  8. j < itemCount
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j++。
  9. 注:跳过空洞后删除剩余索引以保留空洞数量。
  10. j < len
    1. DeletePropertyOrThrow(obj, ! ToString(𝔽(j)))。
    2. j++。
  11. 返回 obj
Note 1

undefined 排序到末尾,其后是不存在的属性。

Note 2

ToString 期间的方法调用可能使比较器不一致。

Note 3

泛型。

23.1.3.30.1 SortIndexedProperties ( obj: an Object, len: a non-negative integer, SortCompare: an Abstract Closure with two parameters, holes: skip-holes or read-through-holes, ): either a normal completion containing a List of ECMAScript language values or a throw completion

  1. items = 空列表;k = 0。
  2. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. holes = skip-holeskRead = ? HasProperty(obj, Pk);否则 kRead = true
    3. kReadkValue = ? Get(obj, Pk);追加 kValue
    4. k++。
  3. 以实现定义次序使用 SortCompare 排序 items;若出现 abrupt 完成即停止并返回。
  4. 返回 items

排序顺序是上述算法步骤 3 完成后 items 的排列顺序。如果对于 items 的元素,SortCompare 不是一个一致的比较器,则排序顺序是实现自定的。当由 Array.prototype.sortArray.prototype.toSorted 调用 SortIndexedProperties 时,如果 comparatorundefined,并且对传给 SortCompare 的任何特定值进行的所有 ToString 应用不会产生相同结果,则排序顺序同样是实现自定的。

除非指定排序顺序是实现自定的,否则它必须满足以下全部条件:

  • 存在某个对小于 itemCount 的非负整数的数学排列 π,使得对每个小于 itemCount 的非负整数 j,元素 old[j]new[π(j)] 完全相同。
  • 然后对所有非负整数 jk(各自小于 itemCount),如果 (SortCompare(old[j], old[k])) < 0,则 π(j) < π(k)
  • 并且对于所有满足 j < k < itemCount 的非负整数 jk,如果 (SortCompare(old[j], old[k])) = 0,则 π(j) < π(k);即排序是稳定的。

这里记号 old[j] 用于指代执行步骤 3 之前的 items[j],记号 new[j] 用于指代执行步骤 3 之后的 items[j]

若一个抽象闭包或函数 comparator 对一组值 S 满足下述所有要求,则称其为该集合的一个一致的比较器。对集合 S 中(可能相同)的所有值 abc,记号 a <C b 表示 (comparator(a, b)) < 0a =C b 表示 (comparator(a, b)) = 0a >C b 表示 (comparator(a, b)) > 0

  • 调用 comparator(a, b) 时,对于特定的值对 ab 总是返回相同的值 v。此外,v 是一个 Number,且 v 不是 NaN。注意这意味着对于给定的 aba <C ba =C ba >C b 三者中恰有一个为真。
  • 调用 comparator(a, b) 不会修改 objobj 原型链上的任何对象。
  • a =C a(自反性)
  • a =C b,则 b =C a(对称性)
  • a =C bb =C c,则 a =C c(=C 的传递性)
  • a <C bb <C c,则 a <C c(<C 的传递性)
  • a >C bb >C c,则 a >C c(>C 的传递性)
Note

上述条件是充分且必要的,以确保 comparator 将集合 S 划分为等价类,并且这些等价类是全序的。

23.1.3.30.2 CompareArrayElements ( x: an ECMAScript language value, y: an ECMAScript language value, comparator: a function object or undefined, ): either a normal completion containing a Number or an abrupt completion

  1. xyundefined 返回 +0𝔽
  2. xundefined 返回 1𝔽
  3. yundefined 返回 -1𝔽
  4. comparatorundefined
    1. v = ? ToNumber(? Call(comparator, undefined, « x, y »))。
    2. vNaN 返回 +0𝔽
    3. 返回 v
  5. xString = ? ToString(x)。
  6. yString = ? ToString(y)。
  7. xSmaller = ! IsLessThan(xString, yString, true)。
  8. xSmallertrue 返回 -1𝔽
  9. ySmaller = ! IsLessThan(yString, xString, true)。
  10. ySmallertrue 返回 1𝔽
  11. 返回 +0𝔽

23.1.3.31 Array.prototype.splice ( start, deleteCount, ...items )

Note 1

start 删除 deleteCount 个元素并以 items 插入,返回被删除元素数组。

步骤:

  1. O = ? ToObject(this value);len = ? LengthOfArrayLike(O)。
  2. relativeStart = ? ToIntegerOrInfinity(start)。
  3. 若 = -∞,actualStart = 0;否则若 <0,actualStart = max(len+relativeStart,0);否则 = min(relativeStart, len)。
  4. itemCount = items 长度。
  5. start 不存在:actualDeleteCount = 0。
  6. 否则若 deleteCount 不存在:actualDeleteCount = len - actualStart
  7. 否则 dc = ? ToIntegerOrInfinity(deleteCount);actualDeleteCount = clamp(dc, 0, len - actualStart)。
  8. len + itemCount - actualDeleteCount > 253-1 抛 TypeError
  9. A = ? ArraySpeciesCreate(O, actualDeleteCount)。
  10. k = 0。当 k < actualDeleteCount
    1. from = ! ToString(𝔽(actualStart + k))。
    2. 若 ? HasProperty(O, from):
      1. fromValue = ? Get(O, from)。
      2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(k)), fromValue)。
    3. k++。
  11. Set(A, "length", 𝔽(actualDeleteCount), true)。
  12. itemCount < actualDeleteCount
    1. k = actualStart
    2. k < (len - actualDeleteCount):
      1. from = ! ToString(𝔽(k + actualDeleteCount))。
      2. to = ! ToString(𝔽(k + itemCount))。
      3. 若 ? HasProperty(O, from):fromValue = ? Get(O, from);? Set(O, to, fromValue, true);否则 Delete to
      4. k++。
    3. k = len
    4. k > (len - actualDeleteCount + itemCount):
      1. DeletePropertyOrThrow(O, ! ToString(𝔽(k-1)))。
      2. k--。
  13. 否则若 itemCount > actualDeleteCount
    1. k = (len - actualDeleteCount)。
    2. k > actualStart
      1. from = ! ToString(𝔽(k + actualDeleteCount -1))。
      2. to = ! ToString(𝔽(k + itemCount -1))。
      3. 若 ? HasProperty(O, from):fromValue = ? Get(O, from);? Set(O, to, fromValue, true);否则 Delete to
      4. k--。
  14. k = actualStart
  15. 对每个 Eitems:? Set(O, ! ToString(𝔽(k)), E, true);k++。
  16. Set(O, "length", 𝔽(len - actualDeleteCount + itemCount), true)。
  17. 返回 A
Note 2

显式设置长度确保非内置数组仍正确。

Note 3

泛型。

23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

支持 ECMA-402 的实现按其规范实现;否则使用此处规范。两个可选参数的意义由 ECMA-402 定义,未实现该 API 时不得另作他用。

Note 1

ECMA-402 第一版未替换此方法的规范。

步骤:

  1. array = ? ToObject(this value),len = ? LengthOfArrayLike(array)。
  2. separator = 实现定义的、符合当前区域设置的列表分隔符(如 ", ")。
  3. R = "";k = 0。
  4. k < len
    1. k > 0:R = R + separator
    2. element = ? Get(array, ! ToString(𝔽(k)))。
    3. elementundefined 且非 null
      1. S = ? ToString(? Invoke(element, "toLocaleString"))。
      2. R = R + S
    4. k++。
  5. 返回 R
Note 2

toString 类似,但使用区域化的元素表示与分隔符。

Note 3

泛型。

23.1.3.33 Array.prototype.toReversed ( )

返回一个新数组,其元素为原数组的反向拷贝。

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. A = ? ArrayCreate(len)。
  3. k = 0。
  4. k < len
    1. from = ! ToString(𝔽(len - k - 1))。
    2. Pk = ! ToString(𝔽(k))。
    3. fromValue = ? Get(O, from)。
    4. CreateDataPropertyOrThrow(A, Pk, fromValue)。
    5. k++。
  5. 返回 A

23.1.3.34 Array.prototype.toSorted ( comparator )

返回排序后的新数组(不修改原数组)。

  1. comparatorundefined 且不可调用,抛 TypeError
  2. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  3. A = ? ArrayCreate(len)。
  4. SortCompare = 抽象闭包(x, y):? CompareArrayElements(x, y, comparator)。
  5. sortedList = ? SortIndexedProperties(O, len, SortCompare, read-through-holes)。
  6. j = 0。
  7. j < len
    1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(j)), sortedList[j])。
    2. j++。
  8. 返回 A

23.1.3.35 Array.prototype.toSpliced ( start, skipCount, ...items )

返回应用类 splice 操作后的新数组(不修改原数组)。

  1. O = ? ToObject(this value),len = ? LengthOfArrayLike(O)。
  2. relativeStart = ? ToIntegerOrInfinity(start)。
  3. 若 = -∞,actualStart = 0;否则若 <0,actualStart = max(len+relativeStart,0);否则 actualStart = min(relativeStart, len)。
  4. insertCount = items 长度。
  5. start 不存在:actualSkipCount = 0;否则若 skipCount 不存在:actualSkipCount = len - actualStart;否则 sc = ? ToIntegerOrInfinity(skipCount);actualSkipCount = clamp(sc, 0, len-actualStart)。
  6. newLen = len + insertCount - actualSkipCount
  7. newLen > 253-1 抛 TypeError
  8. A = ? ArrayCreate(newLen)。
  9. i = 0;r = actualStart + actualSkipCount
  10. i < actualStart
    1. Pi = ! ToString(𝔽(i))。
    2. iValue = ? Get(O, Pi)。
    3. CreateDataPropertyOrThrow(A, Pi, iValue)。
    4. i++。
  11. items 中每个 E
    1. Pi = ! ToString(𝔽(i))。
    2. CreateDataPropertyOrThrow(A, Pi, E)。
    3. i++。
  12. i < newLen
    1. Pi = ! ToString(𝔽(i))。
    2. from = ! ToString(𝔽(r))。
    3. fromValue = ? Get(O, from)。
    4. CreateDataPropertyOrThrow(A, Pi, fromValue)。
    5. i++;r++。
  13. 返回 A

23.1.3.36 Array.prototype.toString ( )

调用时执行:

  1. array = ? ToObject(this value)。
  2. func = ? Get(array, "join")。
  3. IsCallable(func) 为 falsefunc = %Object.prototype.toString%。
  4. 返回 ? Call(func, array)。
Note

泛型。

23.1.3.37 Array.prototype.unshift ( ...items )

将参数插入开头并保持顺序,返回新长度。

步骤:

  1. O = ? ToObject(this value);len = ? LengthOfArrayLike(O)。
  2. argCount = items 长度。
  3. argCount > 0:
    1. len + argCount > 253-1 抛 TypeError
    2. k = len
    3. k > 0:
      1. from = ! ToString(𝔽(k-1));to = ! ToString(𝔽(k + argCount -1))。
      2. fromPresent = ? HasProperty(O, from)。
      3. 若真:fromValue = ? Get(O, from);? Set(O, to, fromValue, true);否则 Delete to
      4. k--。
    4. j = +0𝔽
    5. 对每个 Eitems:? Set(O, ! ToString(j), E, true);j += 1𝔽
  4. Set(O, "length", 𝔽(len + argCount), true)。
  5. 返回 𝔽(len + argCount)。

此方法 "length" 属性为 1𝔽

Note

泛型。

23.1.3.38 Array.prototype.values ( )

步骤:

  1. O = ? ToObject(this value)。
  2. 返回 CreateArrayIterator(O, value)。

23.1.3.39 Array.prototype.with ( index, value )

返回替换给定索引后的新数组(不修改原数组)。

  1. O = ? ToObject(this value);len = ? LengthOfArrayLike(O)。
  2. relativeIndex = ? ToIntegerOrInfinity(index)。
  3. relativeIndex ≥ 0:actualIndex = relativeIndex;否则 actualIndex = len + relativeIndex
  4. actualIndexlenactualIndex < 0 抛 RangeError
  5. A = ? ArrayCreate(len)。
  6. k = 0。
  7. k < len
    1. Pk = ! ToString(𝔽(k))。
    2. k = actualIndexfromValue = value;否则 fromValue = ? Get(O, Pk)。
    3. CreateDataPropertyOrThrow(A, Pk, fromValue)。
    4. k++。
  8. 返回 A

23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 初始值为 %Array.prototype.values%,定义见 23.1.3.38

23.1.3.41 Array.prototype [ %Symbol.unscopables% ]

%Symbol.unscopables% 数据属性初始值按以下步骤创建:

  1. unscopableList = OrdinaryObjectCreate(null)。
  2. CreateDataPropertyOrThrow(unscopableList, "at", true)。
  3. CreateDataPropertyOrThrow(unscopableList, "copyWithin", true)。
  4. CreateDataPropertyOrThrow(unscopableList, "entries", true)。
  5. CreateDataPropertyOrThrow(unscopableList, "fill", true)。
  6. CreateDataPropertyOrThrow(unscopableList, "find", true)。
  7. CreateDataPropertyOrThrow(unscopableList, "findIndex", true)。
  8. CreateDataPropertyOrThrow(unscopableList, "findLast", true)。
  9. CreateDataPropertyOrThrow(unscopableList, "findLastIndex", true)。
  10. CreateDataPropertyOrThrow(unscopableList, "flat", true)。
  11. CreateDataPropertyOrThrow(unscopableList, "flatMap", true)。
  12. CreateDataPropertyOrThrow(unscopableList, "includes", true)。
  13. CreateDataPropertyOrThrow(unscopableList, "keys", true)。
  14. CreateDataPropertyOrThrow(unscopableList, "toReversed", true)。
  15. CreateDataPropertyOrThrow(unscopableList, "toSorted", true)。
  16. CreateDataPropertyOrThrow(unscopableList, "toSpliced", true)。
  17. CreateDataPropertyOrThrow(unscopableList, "values", true)。
  18. 返回 unscopableList

该属性特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

Note

这些名称在 ES2015 前不是标准 Array.prototype 自有属性;在 with 语句中应忽略以避免遮蔽外层绑定。

"with" 未列入是因为其已为 保留字

23.1.4 Array 实例的属性

Array 实例是数组异质对象,具有对应内部方法,并继承自 Array 原型。

Array 实例具有 "length" 属性及一组可枚举数组索引属性。

23.1.4.1 length

"length"数据属性,其值始终大于任一可配置自有数组索引属性名的数值。

初始属性特性:{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

Note

减小 "length" 会删除旧长度与新长度之间的索引元素(不可配置者除外)。若尝试设置长度为小于等于某不可配置索引名的值,则实际长度会被设置为该索引名+1。参见 10.4.2.1

23.1.5 Array 迭代器对象

Array Iterator 表示针对某个特定 Array 实例的一次特定迭代。无命名构造函数;通过调用某些 Array 实例方法创建。

23.1.5.1 CreateArrayIterator ( array, kind )

The abstract operation CreateArrayIterator takes arguments array (an Object) and kind (key+value, key, or value) and returns an Object. 为返回迭代器的 Array 方法创建迭代器对象。 It performs the following steps when called:

  1. iterator = OrdinaryObjectCreate(%ArrayIteratorPrototype%, « [[IteratedArrayLike]], [[ArrayLikeNextIndex]], [[ArrayLikeIterationKind]] »)。
  2. iterator.[[IteratedArrayLike]] = array
  3. iterator.[[ArrayLikeNextIndex]] = 0。
  4. iterator.[[ArrayLikeIterationKind]] = kind
  5. 返回 iterator

23.1.5.2 %ArrayIteratorPrototype% 对象

%ArrayIteratorPrototype% 对象:

23.1.5.2.1 %ArrayIteratorPrototype%.next ( )

  1. O = this
  2. O 非对象抛 TypeError
  3. O 不具备数组迭代器实例全部内部槽抛 TypeError
  4. array = O.[[IteratedArrayLike]]
  5. arrayundefined 返回 CreateIteratorResultObject(undefined, true)。
  6. index = O.[[ArrayLikeNextIndex]]
  7. kind = O.[[ArrayLikeIterationKind]]
  8. array 具有 [[TypedArrayName]]
    1. taRecord = MakeTypedArrayWithBufferWitnessRecord(array, seq-cst)。
    2. IsTypedArrayOutOfBounds(taRecord) 为 trueTypeError
    3. len = TypedArrayLength(taRecord)。
  9. 否则 len = ? LengthOfArrayLike(array)。
  10. indexlen
    1. O.[[IteratedArrayLike]] = undefined
    2. 返回 CreateIteratorResultObject(undefined, true)。
  11. O.[[ArrayLikeNextIndex]] = index + 1。
  12. indexNumber = 𝔽(index)。
  13. kind = keyresult = indexNumber
  14. 否则:
    1. elementKey = ! ToString(indexNumber)。
    2. elementValue = ? Get(array, elementKey)。
    3. kind = valueresult = elementValue;否则(断言 key+valueresult = CreateArrayFromListindexNumber, elementValue »)。
  15. 返回 CreateIteratorResultObject(result, false)。

23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 初始值为 "Array Iterator"

属性特性:{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

23.1.5.3 Array 迭代器实例的属性

Array 迭代器实例继承自内在对象 %ArrayIteratorPrototype%,并具有下表内部槽。

Table 72: Array 迭代器实例的内部槽
Internal Slot Type Description
[[IteratedArrayLike]] an Object or undefined 被迭代的类数组对象
[[ArrayLikeNextIndex]] a non-negative integer 下一个要访问的元素索引。
[[ArrayLikeIterationKind]] key+value, key, or value 迭代时返回的形式。

23.2 TypedArray 对象

TypedArray 提供其底层二进制数据缓冲区的类数组视图(25.1)。TypedArray 元素类型 是所有 TypedArray 实例元素所具有的底层二进制标量数据类型。针对每种受支持的元素类型,在 Table 73 中列出了一个不同的 TypedArray 构造函数Table 73 中的每个构造函数都有其对应且相互不同的原型对象。

Table 73: TypedArray 构造函数
构造函数名称与内在对象 元素类型 元素大小 转换操作 描述
Int8Array
%Int8Array%
int8 1 ToInt8 8 位二进制补码有符号整数
Uint8Array
%Uint8Array%
uint8 1 ToUint8 8 位无符号整数
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped 1 ToUint8Clamp 8 位无符号整数(限制转换)
Int16Array
%Int16Array%
int16 2 ToInt16 16 位二进制补码有符号整数
Uint16Array
%Uint16Array%
uint16 2 ToUint16 16 位无符号整数
Int32Array
%Int32Array%
int32 4 ToInt32 32 位二进制补码有符号整数
Uint32Array
%Uint32Array%
uint32 4 ToUint32 32 位无符号整数
BigInt64Array
%BigInt64Array%
bigint64 8 ToBigInt64 64 位二进制补码有符号整数
BigUint64Array
%BigUint64Array%
biguint64 8 ToBigUint64 64 位无符号整数
Float16Array
%Float16Array%
float16 2 16 位 IEEE 浮点数
Float32Array
%Float32Array%
float32 4 32 位 IEEE 浮点数
Float64Array
%Float64Array%
float64 8 64 位 IEEE 浮点数

在下列定义中,对 TypedArray 的引用应替换为上表中的适当构造函数名称。

23.2.1 %TypedArray% 内在对象

%TypedArray% 内在对象:

  • 是所有 TypedArray 构造函数对象继承自的构造函数对象。
  • 与其对应的原型对象一起,提供所有 TypedArray 构造函数及其实例所继承的共有属性。
  • 没有全局名称,也不作为全局对象的属性出现。
  • 作为各种 TypedArray 构造函数的抽象超类。
  • 作为抽象类构造函数被调用时会抛出错误。TypedArray 构造函数不会对其执行 super 调用。

23.2.1.1 %TypedArray% ( )

该函数被调用时执行以下步骤:

  1. 抛出 TypeError 异常。

此函数的 "length" 属性为 +0𝔽

23.2.2 %TypedArray% 内在对象的属性

%TypedArray% 内在对象:

  • 具有 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • "name" 属性,其值为 "TypedArray"
  • 具有以下属性:

23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )

该方法被调用时执行以下步骤:

  1. Cthis 值。
  2. IsConstructor(C) 为 false,抛出 TypeError 异常。
  3. mapperundefined,则
    1. mappingfalse
  4. 否则,
    1. IsCallable(mapper) 为 false,抛出 TypeError 异常。
    2. mappingtrue
  5. usingIterator 为 ? GetMethod(source, %Symbol.iterator%)。
  6. usingIterator 不为 undefined,则
    1. values 为 ? IteratorToList(? GetIteratorFromMethod(source, usingIterator))。
    2. lenvalues 中元素的数量。
    3. targetObj 为 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)。
    4. k 为 0。
    5. k < len 重复,
      1. Pk 为 ! ToString(𝔽(k))。
      2. kValuevalues 的第一个元素。
      3. 移除 values 的第一个元素。
      4. mappingtrue,则
        1. mappedValue 为 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)。
      5. 否则,
        1. mappedValuekValue
      6. 执行 ? Set(targetObj, Pk, mappedValue, true)。
      7. kk + 1。
    6. 断言:values 现在为空列表。
    7. 返回 targetObj
  7. 注:source 不是可迭代对象,因此假定其已为类数组对象
  8. arrayLike 为 ! ToObject(source)。
  9. len 为 ? LengthOfArrayLike(arrayLike)。
  10. targetObj 为 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)。
  11. k 为 0。
  12. k < len 重复,
    1. Pk 为 ! ToString(𝔽(k))。
    2. kValue 为 ? Get(arrayLike, Pk)。
    3. mappingtrue,则
      1. mappedValue 为 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)。
    4. 否则,
      1. mappedValuekValue
    5. 执行 ? Set(targetObj, Pk, mappedValue, true)。
    6. kk + 1。
  13. 返回 targetObj

23.2.2.2 %TypedArray%.of ( ...items )

该方法被调用时执行以下步骤:

  1. lenitems 中元素的数量。
  2. Cthis 值。
  3. IsConstructor(C) 为 false,抛出 TypeError 异常。
  4. newObj 为 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)。
  5. k 为 0。
  6. k < len 重复,
    1. kValueitems[k]。
    2. Pk 为 ! ToString(𝔽(k))。
    3. 执行 ? Set(newObj, Pk, kValue, true)。
    4. kk + 1。
  7. 返回 newObj

23.2.2.3 %TypedArray%.prototype

%TypedArray%.prototype 的初始值是 %TypedArray% 原型对象

该属性特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.2.4 get %TypedArray% [ %Symbol.species% ]

%TypedArray%[%Symbol.species%] 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. 返回 this 值。

该函数 "name" 属性的值为 "get [Symbol.species]"

Note

%TypedArray.prototype% 的方法通常使用其 this 值的构造函数创建派生对象。然而,子类构造函数可以通过重定义其 %Symbol.species% 属性来覆盖该默认行为。

23.2.3 %TypedArray% 原型对象的属性

%TypedArray% 原型对象

  • 具有 [[Prototype]] 内部槽,其值为 %Object.prototype%
  • %TypedArray.prototype%
  • 是一个普通对象
  • 没有 [[ViewedArrayBuffer]] 或其他特定于 TypedArray 实例对象的内部槽。

23.2.3.1 %TypedArray%.prototype.at ( index )

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. relativeIndex 为 ? ToIntegerOrInfinity(index)。
  5. relativeIndex ≥ 0,则
    1. k = relativeIndex
  6. 否则,
    1. k = len + relativeIndex
  7. k < 0 或 klen,返回 undefined
  8. 返回 ! Get(O, ! ToString(𝔽(k)))。

23.2.3.2 get %TypedArray%.prototype.buffer

%TypedArray%.prototype.buffer 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. Othis 值。
  2. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  3. 断言:O 具有 [[ViewedArrayBuffer]] 内部槽。
  4. bufferO.[[ViewedArrayBuffer]]
  5. 返回 buffer

23.2.3.3 get %TypedArray%.prototype.byteLength

%TypedArray%.prototype.byteLength 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. Othis 值。
  2. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  3. 断言:O 具有 [[ViewedArrayBuffer]] 内部槽。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. sizeTypedArrayByteLength(taRecord)。
  6. 返回 𝔽(size)。

23.2.3.4 get %TypedArray%.prototype.byteOffset

%TypedArray%.prototype.byteOffset 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. Othis 值。
  2. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  3. 断言:O 具有 [[ViewedArrayBuffer]] 内部槽。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. IsTypedArrayOutOfBounds(taRecord) 为 true,返回 +0𝔽
  6. offsetO.[[ByteOffset]]
  7. 返回 𝔽(offset)。

23.2.3.5 %TypedArray%.prototype.constructor

%TypedArray%.prototype.constructor 的初始值为 %TypedArray%

23.2.3.6 %TypedArray%.prototype.copyWithin ( target, start [ , end ] )

此方法参数的解释与用法与 23.1.3.4 中定义的 Array.prototype.copyWithin 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. relativeTarget 为 ? ToIntegerOrInfinity(target)。
  5. relativeTarget = -∞,令 targetIndex = 0。
  6. 否则若 relativeTarget < 0,令 targetIndex = max(len + relativeTarget, 0)。
  7. 否则令 targetIndex = min(relativeTarget, len)。
  8. relativeStart 为 ? ToIntegerOrInfinity(start)。
  9. relativeStart = -∞,令 startIndex = 0。
  10. 否则若 relativeStart < 0,令 startIndex = max(len + relativeStart, 0)。
  11. 否则令 startIndex = min(relativeStart, len)。
  12. endundefined,令 relativeEnd = len;否则令 relativeEnd = ? ToIntegerOrInfinity(end)。
  13. relativeEnd = -∞,令 endIndex = 0。
  14. 否则若 relativeEnd < 0,令 endIndex = max(len + relativeEnd, 0)。
  15. 否则令 endIndex = min(relativeEnd, len)。
  16. countmin(endIndex - startIndex, len - targetIndex)。
  17. count > 0,则
    1. 注:复制必须以保持源数据位级编码的方式进行。
    2. bufferO.[[ViewedArrayBuffer]]
    3. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
    4. IsTypedArrayOutOfBounds(taRecord) 为 true,抛出 TypeError 异常。
    5. lenTypedArrayLength(taRecord)。
    6. elementSizeTypedArrayElementSize(O)。
    7. byteOffsetO.[[ByteOffset]]
    8. bufferByteLimit 为 (len × elementSize) + byteOffset
    9. toByteIndex 为 (targetIndex × elementSize) + byteOffset
    10. fromByteIndex 为 (startIndex × elementSize) + byteOffset
    11. countBytescount × elementSize
    12. fromByteIndex < toByteIndextoByteIndex < fromByteIndex + countBytes,则
      1. direction = -1。
      2. fromByteIndex = fromByteIndex + countBytes - 1。
      3. toByteIndex = toByteIndex + countBytes - 1。
    13. 否则,
      1. direction = 1。
    14. countBytes > 0 重复,
      1. fromByteIndex < bufferByteLimittoByteIndex < bufferByteLimit,则
        1. valueGetValueFromBuffer(buffer, fromByteIndex, uint8, true, unordered)。
        2. 执行 SetValueInBuffer(buffer, toByteIndex, uint8, value, true, unordered)。
        3. fromByteIndex = fromByteIndex + direction
        4. toByteIndex = toByteIndex + direction
        5. countBytes = countBytes - 1。
      2. 否则,
        1. countBytes = 0。
  18. 返回 O

23.2.3.7 %TypedArray%.prototype.entries ( )

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. 执行 ? ValidateTypedArray(O, seq-cst)。
  3. 返回 CreateArrayIterator(O, key+value)。

23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.6 中的 Array.prototype.every 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. k = 0。
  6. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. testResultfalse,返回 false
    5. k = k + 1。
  7. 返回 true

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )

该方法参数的解释与用法与 23.1.3.7 中的 Array.prototype.fill 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. O.[[ContentType]]bigint,设 value 为 ? ToBigInt(value)。
  5. 否则,设 value 为 ? ToNumber(value)。
  6. relativeStart 为 ? ToIntegerOrInfinity(start)。
  7. relativeStart = -∞,令 startIndex = 0。
  8. 否则若 relativeStart < 0,令 startIndex = max(len + relativeStart, 0)。
  9. 否则令 startIndex = min(relativeStart, len)。
  10. endundefined,令 relativeEnd = len;否则令 relativeEnd = ? ToIntegerOrInfinity(end)。
  11. relativeEnd = -∞,令 endIndex = 0。
  12. 否则若 relativeEnd < 0,令 endIndex = max(len + relativeEnd, 0)。
  13. 否则令 endIndex = min(relativeEnd, len)。
  14. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  15. IsTypedArrayOutOfBounds(taRecord) 为 true,抛出 TypeError 异常。
  16. lenTypedArrayLength(taRecord)。
  17. endIndex = min(endIndex, len)。
  18. k = startIndex
  19. k < endIndex 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. 执行 ! Set(O, Pk, value, true)。
    3. k = k + 1。
  20. 返回 O

23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.8 中的 Array.prototype.filter 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. kept 为一个新的空列表。
  6. captured 为 0。
  7. k 为 0。
  8. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. selected = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. selectedtrue,则
      1. kValue 追加到 kept
      2. captured = captured + 1。
    5. k = k + 1。
  9. A 为 ? TypedArraySpeciesCreate(O, « 𝔽(captured) »)。
  10. n = 0。
  11. kept 中每个元素 e
    1. 执行 ! Set(A, ! ToString(𝔽(n)), e, true)。
    2. n = n + 1。
  12. 返回 A

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.9 中的 Array.prototype.find 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. findRec 为 ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  5. 返回 findRec.[[Value]]

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.10 中的 Array.prototype.findIndex 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. findRec 为 ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  5. 返回 findRec.[[Index]]

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.11 中的 Array.prototype.findLast 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. findRec 为 ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  5. 返回 findRec.[[Value]]

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.12 中的 Array.prototype.findLastIndex 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. findRec 为 ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  5. 返回 findRec.[[Index]]

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.15 中的 Array.prototype.forEach 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. k = 0。
  6. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. 执行 ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. k = k + 1。
  7. 返回 undefined

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )

该方法参数的解释与用法与 23.1.3.16 中的 Array.prototype.includes 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. len = 0,返回 false
  5. n 为 ? ToIntegerOrInfinity(fromIndex)。
  6. 断言:若 fromIndexundefined,则 n 为 0。
  7. n = +∞,返回 false
  8. 否则若 n = -∞,设 n = 0。
  9. n ≥ 0,则
    1. k = n
  10. 否则,
    1. k = len + n
    2. k < 0,设 k = 0。
  11. k < len 重复,
    1. elementK 为 ! Get(O, ! ToString(𝔽(k)))。
    2. SameValueZero(searchElement, elementK) 为 true,返回 true
    3. k = k + 1。
  12. 返回 false

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )

该方法参数的解释与用法与 23.1.3.17 中的 Array.prototype.indexOf 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. len = 0,返回 -1𝔽
  5. n 为 ? ToIntegerOrInfinity(fromIndex)。
  6. 断言:若 fromIndexundefined,则 n 为 0。
  7. n = +∞,返回 -1𝔽
  8. 否则若 n = -∞,设 n = 0。
  9. n ≥ 0,则
    1. k = n
  10. 否则,
    1. k = len + n
    2. k < 0,设 k = 0。
  11. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ! HasProperty(O, Pk)。
    3. kPresenttrue,则
      1. elementK = ! Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) 为 true,返回 𝔽(k)。
    4. k = k + 1。
  12. 返回 -1𝔽

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.18 %TypedArray%.prototype.join ( separator )

该方法参数的解释与用法与 23.1.3.18 中的 Array.prototype.join 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. separatorundefined,令 sep = ","
  5. 否则,令 sep = ? ToString(separator)。
  6. R 为空字符串。
  7. k = 0。
  8. k < len 重复,
    1. k > 0,设 RRsep 的字符串拼接。
    2. element 为 ! Get(O, ! ToString(𝔽(k)))。
    3. element 不为 undefined,则
      1. S 为 ! ToString(element)。
      2. RRS 的字符串拼接。
    4. k = k + 1。
  9. 返回 R

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.19 %TypedArray%.prototype.keys ( )

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. 执行 ? ValidateTypedArray(O, seq-cst)。
  3. 返回 CreateArrayIterator(O, key)。

23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

该方法参数的解释与用法与 23.1.3.20 中的 Array.prototype.lastIndexOf 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. len = 0,返回 -1𝔽
  5. 若提供 fromIndex,令 n 为 ? ToIntegerOrInfinity(fromIndex);否则令 n = len - 1。
  6. n = -∞,返回 -1𝔽
  7. n ≥ 0,则
    1. k = min(n, len - 1)。
  8. 否则,
    1. k = len + n
  9. k ≥ 0 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ! HasProperty(O, Pk)。
    3. kPresenttrue,则
      1. elementK = ! Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) 为 true,返回 𝔽(k)。
    4. k = k - 1。
  10. 返回 -1𝔽

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.21 get %TypedArray%.prototype.length

%TypedArray%.prototype.length 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. Othis 值。
  2. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  3. 断言:O 具有 [[ViewedArrayBuffer]][[ArrayLength]] 内部槽。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. IsTypedArrayOutOfBounds(taRecord) 为 true,返回 +0𝔽
  6. lengthTypedArrayLength(taRecord)。
  7. 返回 𝔽(length)。

该函数不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.21 中的 Array.prototype.map 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. A 为 ? TypedArraySpeciesCreate(O, « 𝔽(len) »)。
  6. k = 0。
  7. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. mappedValue = ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. 执行 ? Set(A, Pk, mappedValue, true)。
    5. k = k + 1。
  8. 返回 A

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )

该方法参数的解释与用法与 23.1.3.24 中的 Array.prototype.reduce 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. len = 0 且 initialValue 不存在,抛出 TypeError 异常。
  6. k = 0。
  7. accumulator = undefined
  8. 若存在 initialValue,则
    1. accumulator = initialValue
  9. 否则,
    1. Pk = ! ToString(𝔽(k))。
    2. accumulator = ! Get(O, Pk)。
    3. k = k + 1。
  10. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k = k + 1。
  11. 返回 accumulator

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )

该方法参数的解释与用法与 23.1.3.25 中的 Array.prototype.reduceRight 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. len = 0 且 initialValue 不存在,抛出 TypeError 异常。
  6. k = len - 1。
  7. accumulator = undefined
  8. 若存在 initialValue,则
    1. accumulator = initialValue
  9. 否则,
    1. Pk = ! ToString(𝔽(k))。
    2. accumulator = ! Get(O, Pk)。
    3. k = k - 1。
  10. k ≥ 0 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k = k - 1。
  11. 返回 accumulator

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.25 %TypedArray%.prototype.reverse ( )

该方法参数的解释与用法与 23.1.3.26 中的 Array.prototype.reverse 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. middle = floor(len / 2)。
  5. lower = 0。
  6. lowermiddle 重复,
    1. upper = len - lower - 1。
    2. upperP = ! ToString(𝔽(upper))。
    3. lowerP = ! ToString(𝔽(lower))。
    4. lowerValue = ! Get(O, lowerP)。
    5. upperValue = ! Get(O, upperP)。
    6. 执行 ! Set(O, lowerP, upperValue, true)。
    7. 执行 ! Set(O, upperP, lowerValue, true)。
    8. lower = lower + 1。
  7. 返回 O

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )

该方法在此 TypedArray 中设置多个值,从 source 读取这些值。具体细节依据 source 的类型不同而不同。可选的 offset 指定开始写入的首个元素索引。如省略则视为 0。

其被调用时执行以下步骤:

  1. targetthis 值。
  2. 执行 ? RequireInternalSlot(target, [[TypedArrayName]])。
  3. 断言:target 具有 [[ViewedArrayBuffer]] 内部槽。
  4. targetOffset 为 ? ToIntegerOrInfinity(offset)。
  5. targetOffset < 0,抛出 RangeError 异常。
  6. source 是具有 [[TypedArrayName]] 内部槽的对象,则
    1. 执行 ? SetTypedArrayFromTypedArray(target, targetOffset, source)。
  7. 否则,
    1. 执行 ? SetTypedArrayFromArrayLike(target, targetOffset, source)。
  8. 返回 undefined

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.26.1 SetTypedArrayFromArrayLike ( target, targetOffset, source )

The abstract operation SetTypedArrayFromArrayLike takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (an ECMAScript language value, but not a TypedArray) and returns 返回 unused正常完成或抛出完成. 从 source 读取值并自 targetOffset 开始在 target 中设置多个值。 It performs the following steps when called:

  1. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst)。
  2. IsTypedArrayOutOfBounds(targetRecord) 为 true,抛出 TypeError 异常。
  3. targetLengthTypedArrayLength(targetRecord)。
  4. src 为 ? ToObject(source)。
  5. srcLength 为 ? LengthOfArrayLike(src)。
  6. targetOffset = +∞,抛出 RangeError 异常。
  7. srcLength + targetOffset > targetLength,抛出 RangeError 异常。
  8. k = 0。
  9. k < srcLength 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. value = ? Get(src, Pk)。
    3. targetIndex = 𝔽(targetOffset + k)。
    4. 执行 ? TypedArraySetElement(target, targetIndex, value)。
    5. k = k + 1。
  10. 返回 unused

23.2.3.26.2 SetTypedArrayFromTypedArray ( target, targetOffset, source )

The abstract operation SetTypedArrayFromTypedArray takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (a TypedArray) and returns 返回 unused正常完成或抛出完成. 从 source 读取值并自 targetOffset 开始在 target 中设置多个值。 It performs the following steps when called:

  1. targetBuffertarget.[[ViewedArrayBuffer]]
  2. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst)。
  3. IsTypedArrayOutOfBounds(targetRecord) 为 true,抛出 TypeError 异常。
  4. targetLengthTypedArrayLength(targetRecord)。
  5. srcBuffersource.[[ViewedArrayBuffer]]
  6. srcRecordMakeTypedArrayWithBufferWitnessRecord(source, seq-cst)。
  7. IsTypedArrayOutOfBounds(srcRecord) 为 true,抛出 TypeError 异常。
  8. srcLengthTypedArrayLength(srcRecord)。
  9. targetTypeTypedArrayElementType(target)。
  10. targetElementSizeTypedArrayElementSize(target)。
  11. targetByteOffsettarget.[[ByteOffset]]
  12. srcTypeTypedArrayElementType(source)。
  13. srcElementSizeTypedArrayElementSize(source)。
  14. srcByteOffsetsource.[[ByteOffset]]
  15. targetOffset = +∞,抛出 RangeError 异常。
  16. srcLength + targetOffset > targetLength,抛出 RangeError 异常。
  17. target.[[ContentType]] 不等于 source.[[ContentType]],抛出 TypeError 异常。
  18. IsSharedArrayBuffer(srcBuffer) 为 trueIsSharedArrayBuffer(targetBuffer) 为 truesrcBuffer.[[ArrayBufferData]]targetBuffer.[[ArrayBufferData]],令 sameSharedArrayBuffer = true;否则令 sameSharedArrayBuffer = false
  19. SameValue(srcBuffer, targetBuffer) 为 truesameSharedArrayBuffertrue,则
    1. srcByteLengthTypedArrayByteLength(srcRecord)。
    2. srcBuffer 为 ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength)。
    3. srcByteIndex = 0。
  20. 否则,
    1. srcByteIndex = srcByteOffset
  21. targetByteIndex = (targetOffset × targetElementSize) + targetByteOffset
  22. limit = targetByteIndex + (targetElementSize × srcLength)。
  23. srcTypetargetType,则
    1. 注:复制必须保持源数据的位级编码。
    2. targetByteIndex < limit 重复,
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)。
      2. 执行 SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)。
      3. srcByteIndex = srcByteIndex + 1。
      4. targetByteIndex = targetByteIndex + 1。
  24. 否则,
    1. targetByteIndex < limit 重复,
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, unordered)。
      2. 执行 SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, unordered)。
      3. srcByteIndex = srcByteIndex + srcElementSize
      4. targetByteIndex = targetByteIndex + targetElementSize
  25. 返回 unused

23.2.3.27 %TypedArray%.prototype.slice ( start, end )

该方法参数的解释与用法与 23.1.3.28 中的 Array.prototype.slice 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. srcArrayLengthTypedArrayLength(taRecord)。
  4. relativeStart 为 ? ToIntegerOrInfinity(start)。
  5. relativeStart = -∞,令 startIndex = 0。
  6. 否则若 relativeStart < 0,令 startIndex = max(srcArrayLength + relativeStart, 0)。
  7. 否则令 startIndex = min(relativeStart, srcArrayLength)。
  8. endundefined,令 relativeEnd = srcArrayLength;否则令 relativeEnd = ? ToIntegerOrInfinity(end)。
  9. relativeEnd = -∞,令 endIndex = 0。
  10. 否则若 relativeEnd < 0,令 endIndex = max(srcArrayLength + relativeEnd, 0)。
  11. 否则令 endIndex = min(relativeEnd, srcArrayLength)。
  12. countBytes = max(endIndex - startIndex, 0)。
  13. A 为 ? TypedArraySpeciesCreate(O, « 𝔽(countBytes) »)。
  14. countBytes > 0,则
    1. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
    2. IsTypedArrayOutOfBounds(taRecord) 为 true,抛出 TypeError 异常。
    3. endIndex = min(endIndex, TypedArrayLength(taRecord))。
    4. countBytes = max(endIndex - startIndex, 0)。
    5. srcType = TypedArrayElementType(O)。
    6. targetType = TypedArrayElementType(A)。
    7. srcTypetargetType,则
      1. 注:传输必须保持源数据的位级编码。
      2. srcBuffer = O.[[ViewedArrayBuffer]]
      3. targetBuffer = A.[[ViewedArrayBuffer]]
      4. elementSize = TypedArrayElementSize(O)。
      5. srcByteOffset = O.[[ByteOffset]]
      6. srcByteIndex = (startIndex × elementSize) + srcByteOffset
      7. targetByteIndex = A.[[ByteOffset]]
      8. endByteIndex = targetByteIndex + (countBytes × elementSize)。
      9. targetByteIndex < endByteIndex 重复,
        1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)。
        2. 执行 SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)。
        3. srcByteIndex = srcByteIndex + 1。
        4. targetByteIndex = targetByteIndex + 1。
    8. 否则,
      1. n = 0。
      2. k = startIndex
      3. k < endIndex 重复,
        1. Pk = ! ToString(𝔽(k))。
        2. kValue = ! Get(O, Pk)。
        3. 执行 ! Set(A, ! ToString(𝔽(n)), kValue, true)。
        4. k = k + 1。
        5. n = n + 1。
  15. 返回 A

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )

该方法参数的解释与用法与 23.1.3.29 中的 Array.prototype.some 相同。

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. IsCallable(callback) 为 false,抛出 TypeError 异常。
  5. k = 0。
  6. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. testResulttrue,返回 true
    5. k = k + 1。
  7. 返回 false

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.29 %TypedArray%.prototype.sort ( comparator )

这是一个不同的方法;除下面描述的情况外,其实现与 23.1.3.30Array.prototype.sort 的要求相同。该方法的实现可以利用 this 值是长度固定且其整数索引属性非稀疏的对象这一知识进行优化。

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

其被调用时执行以下步骤:

  1. comparator 不为 undefinedIsCallable(comparator) 为 false,抛出 TypeError 异常。
  2. objthis 值。
  3. taRecord 为 ? ValidateTypedArray(obj, seq-cst)。
  4. lenTypedArrayLength(taRecord)。
  5. 注:以下闭包执行数值比较而非 23.1.3.30 中使用的字符串比较。
  6. SortCompare 为具有参数 (x, y) 并捕获 comparator 的新抽象闭包,调用时执行:
    1. 返回 ? CompareTypedArrayElements(x, y, comparator)。
  7. sortedList 为 ? SortIndexedProperties(obj, len, SortCompare, read-through-holes)。
  8. j = 0。
  9. j < len 重复,
    1. 执行 ! Set(obj, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j = j + 1。
  10. 返回 obj
Note

因为 NaN 总是比较大于任何其他值(见 CompareTypedArrayElements),当未提供 comparator 时,NaN 属性值总是排在结果末尾。

23.2.3.30 %TypedArray%.prototype.subarray ( start, end )

该方法返回一个新的 TypedArray,其元素类型与该 TypedArray 相同,其 ArrayBuffer 为该 TypedArray 的 ArrayBuffer,引用从 start(含)到 end(不含)区间的元素。若 startend 为负值,则表示自数组末尾起的索引。

其被调用时执行以下步骤:

  1. Othis 值。
  2. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  3. 断言:O 具有 [[ViewedArrayBuffer]] 内部槽。
  4. bufferO.[[ViewedArrayBuffer]]
  5. srcRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  6. IsTypedArrayOutOfBounds(srcRecord) 为 true,则
    1. srcLength = 0。
  7. 否则,
    1. srcLength = TypedArrayLength(srcRecord)。
  8. relativeStart 为 ? ToIntegerOrInfinity(start)。
  9. relativeStart = -∞,令 startIndex = 0。
  10. 否则若 relativeStart < 0,令 startIndex = max(srcLength + relativeStart, 0)。
  11. 否则令 startIndex = min(relativeStart, srcLength)。
  12. elementSizeTypedArrayElementSize(O)。
  13. srcByteOffsetO.[[ByteOffset]]
  14. beginByteOffset = srcByteOffset + (startIndex × elementSize)。
  15. O.[[ArrayLength]]autoendundefined,则
    1. argumentsList 为 « buffer, 𝔽(beginByteOffset) »。
  16. 否则,
    1. endundefined,令 relativeEnd = srcLength;否则令 relativeEnd = ? ToIntegerOrInfinity(end)。
    2. relativeEnd = -∞,令 endIndex = 0。
    3. 否则若 relativeEnd < 0,令 endIndex = max(srcLength + relativeEnd, 0)。
    4. 否则令 endIndex = min(relativeEnd, srcLength)。
    5. newLength = max(endIndex - startIndex, 0)。
    6. argumentsList = « buffer, 𝔽(beginByteOffset), 𝔽(newLength) »。
  17. 返回 ? TypedArraySpeciesCreate(O, argumentsList)。

该方法不是泛型。this 值必须为具有 [[TypedArrayName]] 内部槽的对象。

23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

这是一个不同的方法,实现与 23.1.3.32Array.prototype.toLocaleString 的算法相同,只是用 TypedArrayLength 取代对 "length"[[Get]]。在底层缓冲区不可调整大小且整数索引属性非稀疏时,实现可以利用 this 值长度固定的知识进行优化。然而,该优化不得引入任何可观测的指定行为变化。

该方法不是泛型。在求值算法前,使用 this 值与 seq-cst 作为参数调用 ValidateTypedArray。若其结果为异常完成,则抛出该异常而不再执行算法。

Note

若 ECMAScript 实现包含 ECMA-402 国际化 API,则该方法基于 ECMA-402 规范中 Array.prototype.toLocaleString 的算法。

23.2.3.32 %TypedArray%.prototype.toReversed ( )

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. A 为 ? TypedArrayCreateSameType(O, len)。
  5. k = 0。
  6. k < len 重复,
    1. from = ! ToString(𝔽(len - k - 1))。
    2. Pk = ! ToString(𝔽(k))。
    3. fromValue = ! Get(O, from)。
    4. 执行 ! Set(A, Pk, fromValue, true)。
    5. k = k + 1。
  7. 返回 A

23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )

该方法被调用时执行以下步骤:

  1. comparator 不为 undefinedIsCallable(comparator) 为 false,抛出 TypeError 异常。
  2. Othis 值。
  3. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  4. lenTypedArrayLength(taRecord)。
  5. A 为 ? TypedArrayCreateSameType(O, len)。
  6. 注:以下闭包执行数值比较,而非 23.1.3.34 中使用的字符串比较。
  7. SortCompare 为具有参数 (x, y) 并捕获 comparator 的新抽象闭包,调用时执行:
    1. 返回 ? CompareTypedArrayElements(x, y, comparator)。
  8. sortedList 为 ? SortIndexedProperties(O, len, SortCompare, read-through-holes)。
  9. j = 0。
  10. j < len 重复,
    1. 执行 ! Set(A, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j = j + 1。
  11. 返回 A

23.2.3.34 %TypedArray%.prototype.toString ( )

"toString" 属性的初始值为 %Array.prototype.toString%,定义见 23.1.3.36

23.2.3.35 %TypedArray%.prototype.values ( )

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. 执行 ? ValidateTypedArray(O, seq-cst)。
  3. 返回 CreateArrayIterator(O, value)。

23.2.3.36 %TypedArray%.prototype.with ( index, value )

该方法被调用时执行以下步骤:

  1. Othis 值。
  2. taRecord 为 ? ValidateTypedArray(O, seq-cst)。
  3. lenTypedArrayLength(taRecord)。
  4. relativeIndex 为 ? ToIntegerOrInfinity(index)。
  5. relativeIndex ≥ 0,令 actualIndex = relativeIndex
  6. 否则,令 actualIndex = len + relativeIndex
  7. O.[[ContentType]]bigint,令 numericValue = ? ToBigInt(value)。
  8. 否则,令 numericValue = ? ToNumber(value)。
  9. IsValidIntegerIndex(O, 𝔽(actualIndex)) 为 false,抛出 RangeError 异常。
  10. A 为 ? TypedArrayCreateSameType(O, len)。
  11. k = 0。
  12. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. k = actualIndex,令 fromValue = numericValue;否则令 fromValue = ! Get(O, Pk)。
    3. 执行 ! Set(A, Pk, fromValue, true)。
    4. k = k + 1。
  13. 返回 A

23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 属性的初始值为 %TypedArray.prototype.values%,定义见 23.2.3.35

23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]

%TypedArray%.prototype[%Symbol.toStringTag%] 是一个存取器属性,其 set 访问器函数为 undefined。其 get 访问器函数被调用时执行:

  1. Othis 值。
  2. O 不是对象,返回 undefined
  3. O 不具有 [[TypedArrayName]] 内部槽,返回 undefined
  4. name = O.[[TypedArrayName]]
  5. 断言:name 是一个字符串。
  6. 返回 name

该属性特性为 { [[Enumerable]]: false, [[Configurable]]: true }。

该函数 "name" 属性的初始值为 "get [Symbol.toStringTag]"

23.2.4 TypedArray 对象的抽象操作

23.2.4.1 TypedArrayCreateFromConstructor ( constructor, argumentList )

The abstract operation TypedArrayCreateFromConstructor takes arguments constructor (a constructor) and argumentList (a List of ECMAScript language values) and returns 返回一个 TypedArray正常完成或抛出完成. 用于通过构造函数创建一个新的 TypedArray。 It performs the following steps when called:

  1. newTypedArray 为 ? Construct(constructor, argumentList)。
  2. taRecord 为 ? ValidateTypedArray(newTypedArray, seq-cst)。
  3. 断言:newTypedArray 具有 TypedArray 实例的属性 中提及的所有内部槽。
  4. argumentList 中元素数量为 1 且 argumentList[0] 是 Number,则
    1. IsTypedArrayOutOfBounds(taRecord) 为 true,抛出 TypeError 异常。
    2. lengthTypedArrayLength(taRecord)。
    3. length < (argumentList[0]),抛出 TypeError 异常。
  5. 返回 newTypedArray

23.2.4.2 TypedArrayCreateSameType ( exemplar, length )

The abstract operation TypedArrayCreateSameType takes arguments exemplar (a TypedArray) and length (a non-negative integer) and returns 返回一个 TypedArray正常完成或抛出完成. 用于使用从 exemplar 派生的构造函数及一个 length 创建新的 TypedArray。不同于可通过 %Symbol.species% 构造自定义子类的 TypedArraySpeciesCreate,本操作始终使用内置的 TypedArray 构造函数之一。 It performs the following steps when called:

  1. constructor 为与 exemplar.[[TypedArrayName]]构造函数名称关联的内在对象,见 Table 73
  2. result 为 ? TypedArrayCreateFromConstructor(constructor, « 𝔽(length) »)。
  3. 断言:result 具有 [[TypedArrayName]][[ContentType]] 内部槽。
  4. 断言:result.[[ContentType]]exemplar.[[ContentType]]
  5. 返回 result

23.2.4.3 TypedArraySpeciesCreate ( exemplar, argumentList )

The abstract operation TypedArraySpeciesCreate takes arguments exemplar (a TypedArray) and argumentList (a List of ECMAScript language values) and returns 返回一个 TypedArray正常完成或抛出完成. 用于通过从 exemplar 派生的构造函数创建新的 TypedArray。不同于可通过 %Symbol.species% 创建非 Array 对象的 ArraySpeciesCreate,该操作强制构造函数必须创建一个实际的 TypedArray。 It performs the following steps when called:

  1. defaultConstructor 为与 exemplar.[[TypedArrayName]]构造函数名称关联的内在对象,见 Table 73
  2. constructor 为 ? SpeciesConstructor(exemplar, defaultConstructor)。
  3. result 为 ? TypedArrayCreateFromConstructor(constructor, argumentList)。
  4. result.[[ContentType]] 不为 exemplar.[[ContentType]],抛出 TypeError 异常。
  5. 返回 result

23.2.4.4 ValidateTypedArray ( O, order )

The abstract operation ValidateTypedArray takes arguments O (an ECMAScript language value) and order (seq-cst or unordered) and returns 返回一个带缓冲见证记录的 TypedArray正常完成或抛出完成. It performs the following steps when called:

  1. 执行 ? RequireInternalSlot(O, [[TypedArrayName]])。
  2. 断言:O 具有 [[ViewedArrayBuffer]] 内部槽。
  3. taRecordMakeTypedArrayWithBufferWitnessRecord(O, order)。
  4. IsTypedArrayOutOfBounds(taRecord) 为 true,抛出 TypeError 异常。
  5. 返回 taRecord

23.2.4.5 TypedArrayElementSize ( O )

The abstract operation TypedArrayElementSize takes argument O (a TypedArray) and returns a non-negative integer. It performs the following steps when called:

  1. 返回在 Table 73 中为 O.[[TypedArrayName]] 指定的元素大小值。

23.2.4.6 TypedArrayElementType ( O )

The abstract operation TypedArrayElementType takes argument O (a TypedArray) and returns a TypedArray element type. It performs the following steps when called:

  1. 返回在 Table 73 中为 O.[[TypedArrayName]] 指定的元素类型值。

23.2.4.7 CompareTypedArrayElements ( x, y, comparator )

The abstract operation CompareTypedArrayElements takes arguments x (a Number or a BigInt), y (a Number or a BigInt), and comparator (a function object or undefined) and returns 返回一个 Number 的正常完成或一个突然完成. It performs the following steps when called:

  1. 断言:xy 同为 Number,或 xy 同为 BigInt。
  2. comparator 不为 undefined,则
    1. v 为 ? ToNumber(? Call(comparator, undefined, « x, y »))。
    2. vNaN,返回 +0𝔽
    3. 返回 v
  3. xy 均为 NaN,返回 +0𝔽
  4. xNaN,返回 1𝔽
  5. yNaN,返回 -1𝔽
  6. x < y,返回 -1𝔽
  7. x > y,返回 1𝔽
  8. x-0𝔽y+0𝔽,返回 -1𝔽
  9. x+0𝔽y-0𝔽,返回 1𝔽
  10. 返回 +0𝔽
Note
该操作执行数值比较,而非 23.1.3.30.2 中使用的字符串比较。

23.2.5 TypedArray 构造函数

每个 TypedArray 构造函数

  • 是具有下文所述结构的内在对象,区别仅在于在 Table 73 中用作构造函数名的名称不同于 TypedArray
  • 是其行为根据参数数量与类型而不同的函数。一次 TypedArray 调用的实际行为取决于传入的参数数量与种类。
  • 不应作为函数被调用,若以此方式调用将抛出异常。
  • 可作为类定义 extends 子句的值。意在继承所规定 TypedArray 行为的子类构造函数必须包含对 TypedArray 构造函数super 调用,以使用支持 %TypedArray%.prototype 内置方法所需的内部状态创建并初始化子类实例。

23.2.5.1 TypedArray ( ...args )

每个 TypedArray 构造函数被调用时执行以下步骤:

  1. 若 NewTarget 为 undefined,抛出 TypeError 异常。
  2. constructorName 为此 TypedArray 构造函数Table 73 中指定的构造函数名称的字符串值。
  3. proto"%TypedArray.prototype%"
  4. numberOfArgsargs 中元素的数量。
  5. numberOfArgs = 0,则
    1. 返回 ? AllocateTypedArray(constructorName, NewTarget, proto, 0)。
  6. 否则,
    1. firstArgument = args[0]。
    2. firstArgument 是对象,则
      1. O 为 ? AllocateTypedArray(constructorName, NewTarget, proto)。
      2. firstArgument 具有 [[TypedArrayName]] 内部槽,则
        1. 执行 ? InitializeTypedArrayFromTypedArray(O, firstArgument)。
      3. 否则若 firstArgument 具有 [[ArrayBufferData]] 内部槽,则
        1. numberOfArgs > 1,令 byteOffset = args[1];否则 byteOffset = undefined
        2. numberOfArgs > 2,令 length = args[2];否则 length = undefined
        3. 执行 ? InitializeTypedArrayFromArrayBuffer(O, firstArgument, byteOffset, length)。
      4. 否则,
        1. 断言:firstArgument 是对象且不具有 [[TypedArrayName]][[ArrayBufferData]]
        2. usingIterator = ? GetMethod(firstArgument, %Symbol.iterator%)。
        3. usingIterator 不为 undefined,则
          1. values = ? IteratorToList(? GetIteratorFromMethod(firstArgument, usingIterator))。
          2. 执行 ? InitializeTypedArrayFromList(O, values)。
        4. 否则,
          1. 注:firstArgument 不是可迭代对象,因此假定其已为类数组对象
          2. 执行 ? InitializeTypedArrayFromArrayLike(O, firstArgument)。
      5. 返回 O
    3. 否则,
      1. 断言:firstArgument 不是对象。
      2. elementLength = ? ToIndex(firstArgument)。
      3. 返回 ? AllocateTypedArray(constructorName, NewTarget, proto, elementLength)。

23.2.5.1.1 AllocateTypedArray ( constructorName, newTarget, defaultProto [ , length ] )

The abstract operation AllocateTypedArray takes arguments constructorName (a String which is the name of a TypedArray constructor in Table 73), newTarget (a constructor), and defaultProto (a String) and optional argument length (a non-negative integer) and returns 返回一个 TypedArray正常完成或抛出完成. 用于验证并创建某个 TypedArray 构造函数的实例。若传入 length,则还会分配一个该长度的 ArrayBuffer 并与新实例关联。AllocateTypedArray 提供 TypedArray 使用的通用语义。 It performs the following steps when called:

  1. proto 为 ? GetPrototypeFromConstructor(newTarget, defaultProto)。
  2. objTypedArrayCreate(proto)。
  3. 断言:obj.[[ViewedArrayBuffer]]undefined
  4. obj.[[TypedArrayName]] = constructorName
  5. constructorName"BigInt64Array""BigUint64Array",设 obj.[[ContentType]] = bigint
  6. 否则,设 obj.[[ContentType]] = number
  7. length 不存在,则
    1. obj.[[ByteLength]] = 0。
    2. obj.[[ByteOffset]] = 0。
    3. obj.[[ArrayLength]] = 0。
  8. 否则,
    1. 执行 ? AllocateTypedArrayBuffer(obj, length)。
  9. 返回 obj

23.2.5.1.2 InitializeTypedArrayFromTypedArray ( O, srcArray )

The abstract operation InitializeTypedArrayFromTypedArray takes arguments O (a TypedArray) and srcArray (a TypedArray) and returns 返回 unused正常完成或抛出完成. It performs the following steps when called:

  1. srcData = srcArray.[[ViewedArrayBuffer]]
  2. elementType = TypedArrayElementType(O)。
  3. elementSize = TypedArrayElementSize(O)。
  4. srcType = TypedArrayElementType(srcArray)。
  5. srcElementSize = TypedArrayElementSize(srcArray)。
  6. srcByteOffset = srcArray.[[ByteOffset]]
  7. srcRecordMakeTypedArrayWithBufferWitnessRecord(srcArray, seq-cst)。
  8. IsTypedArrayOutOfBounds(srcRecord) 为 true,抛出 TypeError 异常。
  9. elementLength = TypedArrayLength(srcRecord)。
  10. byteLength = elementSize × elementLength
  11. elementTypesrcType,则
    1. data = ? CloneArrayBuffer(srcData, srcByteOffset, byteLength)。
  12. 否则,
    1. data = ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)。
    2. srcArray.[[ContentType]] 不等于 O.[[ContentType]],抛出 TypeError 异常。
    3. srcByteIndex = srcByteOffset
    4. targetByteIndex = 0。
    5. count = elementLength
    6. count > 0 重复,
      1. value = GetValueFromBuffer(srcData, srcByteIndex, srcType, true, unordered)。
      2. 执行 SetValueInBuffer(data, targetByteIndex, elementType, value, true, unordered)。
      3. srcByteIndex = srcByteIndex + srcElementSize
      4. targetByteIndex = targetByteIndex + elementSize
      5. count = count - 1。
  13. O.[[ViewedArrayBuffer]] = data
  14. O.[[ByteLength]] = byteLength
  15. O.[[ByteOffset]] = 0。
  16. O.[[ArrayLength]] = elementLength
  17. 返回 unused

23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( O, buffer, byteOffset, length )

The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments O (a TypedArray), buffer (an ArrayBuffer or a SharedArrayBuffer), byteOffset (an ECMAScript language value), and length (an ECMAScript language value) and returns 返回 unused正常完成或抛出完成. It performs the following steps when called:

  1. elementSize = TypedArrayElementSize(O)。
  2. offset = ? ToIndex(byteOffset)。
  3. offsetelementSize ≠ 0,抛出 RangeError 异常。
  4. bufferIsFixedLength = IsFixedLengthArrayBuffer(buffer)。
  5. length 不为 undefined,则
    1. newLength = ? ToIndex(length)。
  6. IsDetachedBuffer(buffer) 为 true,抛出 TypeError 异常。
  7. bufferByteLength = ArrayBufferByteLength(buffer, seq-cst)。
  8. lengthundefinedbufferIsFixedLengthfalse,则
    1. offset > bufferByteLength,抛出 RangeError 异常。
    2. O.[[ByteLength]] = auto
    3. O.[[ArrayLength]] = auto
  9. 否则,
    1. lengthundefined,则
      1. bufferByteLengthelementSize ≠ 0,抛出 RangeError 异常。
      2. newByteLength = bufferByteLength - offset
      3. newByteLength < 0,抛出 RangeError 异常。
    2. 否则,
      1. newByteLength = newLength × elementSize
      2. offset + newByteLength > bufferByteLength,抛出 RangeError 异常。
    3. O.[[ByteLength]] = newByteLength
    4. O.[[ArrayLength]] = newByteLength / elementSize
  10. O.[[ViewedArrayBuffer]] = buffer
  11. O.[[ByteOffset]] = offset
  12. 返回 unused

23.2.5.1.4 InitializeTypedArrayFromList ( O, values )

The abstract operation InitializeTypedArrayFromList takes arguments O (a TypedArray) and values (a List of ECMAScript language values) and returns 返回 unused正常完成或抛出完成. It performs the following steps when called:

  1. lenvalues 中的元素数量。
  2. 执行 ? AllocateTypedArrayBuffer(O, len)。
  3. k = 0。
  4. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValuevalues 的第一个元素。
    3. 移除 values 的第一个元素。
    4. 执行 ? Set(O, Pk, kValue, true)。
    5. k = k + 1。
  5. 断言:values 现在为空列表。
  6. 返回 unused

23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O, arrayLike )

The abstract operation InitializeTypedArrayFromArrayLike takes arguments O (a TypedArray) and arrayLike (an Object, but not a TypedArray or an ArrayBuffer) and returns 返回 unused正常完成或抛出完成. It performs the following steps when called:

  1. len 为 ? LengthOfArrayLike(arrayLike)。
  2. 执行 ? AllocateTypedArrayBuffer(O, len)。
  3. k = 0。
  4. k < len 重复,
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ? Get(arrayLike, Pk)。
    3. 执行 ? Set(O, Pk, kValue, true)。
    4. k = k + 1。
  5. 返回 unused

23.2.5.1.6 AllocateTypedArrayBuffer ( O, length )

The abstract operation AllocateTypedArrayBuffer takes arguments O (a TypedArray) and length (a non-negative integer) and returns 返回 unused正常完成或抛出完成. 为 O 分配并关联一个 ArrayBuffer。 It performs the following steps when called:

  1. 断言:O.[[ViewedArrayBuffer]]undefined
  2. elementSize = TypedArrayElementSize(O)。
  3. byteLength = elementSize × length
  4. data = ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)。
  5. O.[[ViewedArrayBuffer]] = data
  6. O.[[ByteLength]] = byteLength
  7. O.[[ByteOffset]] = 0。
  8. O.[[ArrayLength]] = length
  9. 返回 unused

23.2.6 TypedArray 构造函数的属性

每个 TypedArray 构造函数

  • 具有 [[Prototype]] 内部槽,其值为 %TypedArray%
  • 具有 "length" 属性,其值为 3𝔽
  • 具有 "name" 属性,其值为在 Table 73 中为其指定的构造函数名称的字符串值。
  • 具有以下属性:

23.2.6.1 TypedArray.BYTES_PER_ELEMENT

TypedArray.BYTES_PER_ELEMENT 的值是 Table 73 中为 TypedArray 指定的元素大小值。

该属性特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.6.2 TypedArray.prototype

TypedArray.prototype 的初始值是对应的 TypedArray 原型内在对象(23.2.7)。

该属性特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.7 TypedArray 原型对象的属性

每个 TypedArray 原型对象:

  • 具有 [[Prototype]] 内部槽,其值为 %TypedArray.prototype%
  • 是一个普通对象
  • 没有 [[ViewedArrayBuffer]] 或其他特定于 TypedArray 实例对象的内部槽。

23.2.7.1 TypedArray.prototype.BYTES_PER_ELEMENT

TypedArray.prototype.BYTES_PER_ELEMENT 的值是 Table 73 中为 TypedArray 指定的元素大小值。

该属性特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.7.2 TypedArray.prototype.constructor

给定 TypedArray 构造函数的原型的 "constructor" 属性初始值为该构造函数本身。

23.2.8 TypedArray 实例的属性

TypedArray 实例是 TypedArrays。每个 TypedArray 实例从对应的 TypedArray 原型对象继承属性。每个 TypedArray 实例具有以下内部槽:[[ViewedArrayBuffer]][[TypedArrayName]][[ContentType]][[ByteLength]][[ByteOffset]][[ArrayLength]]