7 抽象操作 (Abstract Operations)

这些操作不属于 ECMAScript 语言本身;它们仅在此定义,用于辅助描述 ECMAScript 语言语义。本规范其余部分还定义了其他更专业的抽象操作

7.1 类型转换 (Type Conversion)

ECMAScript 语言会按需隐式执行自动类型转换。为澄清某些结构的语义,有必要定义一组转换类抽象操作。转换抽象操作是多态的;它们可以接受任意 ECMAScript 语言类型的值。但不会与其它规范类型(specification types)一起使用。

BigInt 类型在 ECMAScript 语言中没有隐式转换;程序员必须显式调用 BigInt 以从其他类型转换值。

7.1.1 ToPrimitive ( input: 一个 ECMAScript 语言值, 可选 preferredType: stringnumber, ): 返回包含一个 ECMAScript 语言值的正常完成或一个抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 将参数 input 转换为非 Object 的类型。如果一个对象可以转换为多个不同的原始类型,它可利用可选提示 preferredType 来偏向该类型。 It performs the following steps when called:

  1. 如果 input 是一个 Object,则
    1. exoticToPrim 为 ? GetMethod(input, %Symbol.toPrimitive%)。
    2. 如果 exoticToPrim 不为 undefined,则
      1. 如果 preferredType 不存在,
        1. hint"default"
      2. 否则如果 preferredTypestring
        1. hint"string"
      3. 否则,
        1. 断言:preferredTypenumber
        2. hint"number"
      4. result 为 ? Call(exoticToPrim, input, « hint »)。
      5. 如果 result 不是一个 Object,返回 result
      6. 抛出 TypeError 异常。
    3. 如果 preferredType 不存在,令 preferredTypenumber
    4. 返回 ? OrdinaryToPrimitive(input, preferredType)。
  2. 返回 input
Note

当 ToPrimitive 未带 hint 被调用时,一般表现为 hint 为 number。但对象可通过定义 %Symbol.toPrimitive% 方法来覆写此行为。本规范中只有 Date(参见 21.4.4.45)和 Symbol 对象(参见 20.4.3.5)覆写默认行为。Date 在缺少 hint 时将其视为 string

7.1.1.1 OrdinaryToPrimitive ( O, hint )

The abstract operation OrdinaryToPrimitive takes arguments O (一个 Object) and hint (stringnumber) and returns 返回包含一个 ECMAScript 语言值正常完成或一个抛出完成. It performs the following steps when called:

  1. 如果 hintstring,则
    1. methodNames 为 « "toString", "valueOf" »。
  2. 否则,
    1. methodNames 为 « "valueOf", "toString" »。
  3. 对于 methodNames 的每个元素 name,执行
    1. method 为 ? Get(O, name)。
    2. 如果 IsCallable(method) 是 true,则
      1. result 为 ? Call(method, O)。
      2. 如果 result 不是一个 Object,返回 result
  4. 抛出 TypeError 异常。

7.1.2 ToBoolean ( argument )

The abstract operation ToBoolean takes argument argument (一个 ECMAScript 语言值) and returns 一个 Boolean. 将 argument 转换为 Boolean 类型。 It performs the following steps when called:

  1. 如果 argument 是 Boolean,返回 argument
  2. 如果 argumentundefinednull+0𝔽-0𝔽NaN0 或空字符串,返回 false
  3. Normative Optional
    如果宿主是 web 浏览器或支持 [[IsHTMLDDA]] 内部槽,则
    1. 如果 argument 是 Object 且具有 [[IsHTMLDDA]] 内部槽,返回 false
  4. 返回 true

7.1.3 ToNumeric ( value )

The abstract operation ToNumeric takes argument value (一个 ECMAScript 语言值) and returns 返回包含 Number 或 BigInt 的正常完成,或抛出完成. 返回 value 转换后的 Number 或 BigInt。 It performs the following steps when called:

  1. primValue 为 ? ToPrimitive(value, number)。
  2. 如果 primValue 是 BigInt,返回 primValue
  3. 返回 ? ToNumber(primValue)。

7.1.4 ToNumber ( argument )

The abstract operation ToNumber takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个 Number 的正常完成或抛出完成. 将 argument 转换为 Number 类型。 It performs the following steps when called:

  1. 如果 argument 是 Number,返回 argument
  2. 如果 argument 是 Symbol 或 BigInt,抛出 TypeError 异常。
  3. 如果 argumentundefined,返回 NaN
  4. 如果 argumentnullfalse,返回 +0𝔽
  5. 如果 argumenttrue,返回 1𝔽
  6. 如果 argument 是 String,返回 StringToNumber(argument)。
  7. 断言:argument 是一个 Object。
  8. primValue 为 ? ToPrimitive(argument, number)。
  9. 断言:primValue 不是 Object
  10. 返回 ? ToNumber(primValue)。

7.1.4.1 应用于 String 类型的 ToNumber

抽象操作 StringToNumber 规定如何使用下列语法将一个 String 值转换为 Number 值。

Syntax

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

未在上方显式定义的语法符号,采用数字字面量词法语法 (12.9.3) 中的定义。

Note

需要注意 StringNumericLiteralNumericLiteral 语法之间的一些差异:

7.1.4.1.1 StringToNumber ( str )

The abstract operation StringToNumber takes argument str (一个 String) and returns 一个 Number. It performs the following steps when called:

  1. literal 为 ParseText(str, StringNumericLiteral)。
  2. 如果 literal 是一个错误列表,返回 NaN
  3. 返回 literal 的 StringNumericValue。

7.1.4.1.2 运行时语义:StringNumericValue

The syntax-directed operation 运行时语义:StringNumericValue takes no arguments and returns 一个 Number.

Note

StringNumericLiteral 转换为 Number 值的整体过程与确定 NumericLiteral 的 NumericValue 类似(参见 12.9.3),但细节有所不同。

It is defined piecewise over the following productions:

StringNumericLiteral ::: StrWhiteSpaceopt
  1. 返回 +0𝔽
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. 返回 StrNumericLiteral 的 StringNumericValue。
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 返回 𝔽(NonDecimalIntegerLiteral 的 MV)。
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. aStrUnsignedDecimalLiteral 的 StringNumericValue。
  2. 如果 a+0𝔽,返回 -0𝔽
  3. 返回 -a
StrUnsignedDecimalLiteral ::: Infinity
  1. 返回 +∞𝔽
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. a 为第一个 DecimalDigits 的 MV。
  2. 如果第二个 DecimalDigits 存在,则
    1. b 为第二个 DecimalDigits 的 MV。
    2. n 为第二个 DecimalDigits 的码点数量。
  3. 否则,
    1. b 为 0。
    2. n 为 0。
  4. 如果 ExponentPart 存在,令 e 为其 MV;否则令 e 为 0。
  5. 返回 RoundMVResult((a + (b × 10-n)) × 10e)。
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. bDecimalDigits 的 MV。
  2. 如果 ExponentPart 存在,令 e 为其 MV;否则令 e 为 0。
  3. nDecimalDigits 的码点数量。
  4. 返回 RoundMVResult(b × 10e - n)。
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. aDecimalDigits 的 MV。
  2. 如果 ExponentPart 存在,令 e 为其 MV;否则令 e 为 0。
  3. 返回 RoundMVResult(a × 10e)。

7.1.4.1.3 RoundMVResult ( n )

The abstract operation RoundMVResult takes argument n (一个数学值) and returns 一个 Number. 以实现定义的方式将 n 转换为 Number。对本抽象操作而言,若一位数字不是 0,或其左侧与右侧存在非零数字,则该位为有效数字。此处“数学值的表示所表示的数学值”与“数学值的十进制表示”互为逆过程。 It performs the following steps when called:

  1. 如果 n 的十进制表示有不超过 20 个有效数字,返回 𝔽(n)。
  2. option1 为将 n 十进制表示中第 20 位之后的每个有效数字替换为 0 后所表示的数学值
  3. option2 为将 n 十进制表示中第 20 位之后的每个有效数字替换为 0,然后对第 20 位进位(必要时连锁进位)后所表示的数学值
  4. chosen 为实现定义地在 option1option2 中选择的其中一个。
  5. 返回 𝔽(chosen)。

7.1.5 ToIntegerOrInfinity ( argument )

The abstract operation ToIntegerOrInfinity takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整数、+∞、- ∞ 的正常完成,或抛出完成. 将 argument 转换为其 Number 值去掉小数部分后的整数;若该 Number 值为无穷大,则转换为 +∞ 或 -∞。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 numberNaN+0𝔽-0𝔽,返回 0。
  3. 如果 number+∞𝔽,返回 +∞。
  4. 如果 number-∞𝔽,返回 -∞。
  5. 返回 truncate((number))。
Note
𝔽(ToIntegerOrInfinity(x)) 对任意 x 都不会返回 -0𝔽。截断小数部分在将 x 转换为数学值之后执行。

7.1.6 ToInt32 ( argument )

The abstract operation ToInt32 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或一个抛出完成. 将 argument 转换为 232 个整型 Number 值之一,范围为 𝔽(-231) 到 𝔽(231 - 1)(含)。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int32bitint modulo 232
  5. 如果 int32bit ≥ 231,返回 𝔽(int32bit - 232);否则返回 𝔽(int32bit)。
Note

基于上述定义:

  • ToInt32 是幂等的:对其输出再次应用结果不变。
  • 对所有 x,ToInt32(ToUint32(x)) 与 ToInt32(x) 相同。(为保持此性质,+∞𝔽-∞𝔽 被映射为 +0𝔽。)
  • ToInt32 将 -0𝔽 映射为 +0𝔽

7.1.7 ToUint32 ( argument )

The abstract operation ToUint32 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或一个抛出完成. 将 argument 转换为 232 个整型 Number 值之一,范围为 +0𝔽𝔽(232 - 1)(含)。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int32bitint modulo 232
  5. 返回 𝔽(int32bit)。
Note

基于上述定义:

  • 步骤 5 是 ToUint32 与 ToInt32 的唯一差别。
  • ToUint32 幂等。
  • 对所有 x,ToUint32(ToInt32(x)) 与 ToUint32(x) 相同。(为保持此性质,+∞𝔽-∞𝔽 被映射为 +0𝔽。)
  • ToUint32 将 -0𝔽 映射为 +0𝔽

7.1.8 ToInt16 ( argument )

The abstract operation ToInt16 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或抛出完成. 转换为 216 个整型 Number 之一,范围 𝔽(-215) 到 𝔽(215 - 1)。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int16bitint modulo 216
  5. 如果 int16bit ≥ 215,返回 𝔽(int16bit - 216);否则返回 𝔽(int16bit)。

7.1.9 ToUint16 ( argument )

The abstract operation ToUint16 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或抛出完成. 转换为 216 个整型 Number 之一,范围 +0𝔽𝔽(216 - 1)。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int16bitint modulo 216
  5. 返回 𝔽(int16bit)。
Note

基于上述定义:

  • 在步骤 4 中把 216 代替 232ToUint32 与 ToUint16 的唯一差别。
  • ToUint16 将 -0𝔽 映射为 +0𝔽

7.1.10 ToInt8 ( argument )

The abstract operation ToInt8 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或抛出完成. 转换为 28 个整型 Number 之一,范围 -128𝔽127𝔽。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int8bitint modulo 28
  5. 如果 int8bit ≥ 27,返回 𝔽(int8bit - 28);否则返回 𝔽(int8bit)。

7.1.11 ToUint8 ( argument )

The abstract operation ToUint8 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或抛出完成. 转换为 28 个整型 Number 之一,范围 +0𝔽255𝔽。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 number 不是有限数或为 +0𝔽-0𝔽,返回 +0𝔽
  3. inttruncate((number))。
  4. int8bitint modulo 28
  5. 返回 𝔽(int8bit)。

7.1.12 ToUint8Clamp ( argument )

The abstract operation ToUint8Clamp takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个整型 Number 的正常完成或抛出完成. 对 argument 进行钳制并取整,结果为 28 个整型 Number 之一,范围 +0𝔽255𝔽。 It performs the following steps when called:

  1. number 为 ? ToNumber(argument)。
  2. 如果 numberNaN,返回 +0𝔽
  3. mvnumber扩展数学值
  4. clampedmv 在 0 与 255 之间钳制的结果。
  5. ffloor(clamped)。
  6. 如果 clamped < f + 0.5,返回 𝔽(f)。
  7. 如果 clamped > f + 0.5,返回 𝔽(f + 1)。
  8. 如果 f 是偶数,返回 𝔽(f);否则返回 𝔽(f + 1)。
Note

不同于大多数整数转换操作,ToUint8Clamp 会四舍五入而不是截断非整数值,它使用“round half to even”平分舍入规则,不同于 Math.round 的“round half up”。

7.1.13 ToBigInt ( argument )

The abstract operation ToBigInt takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 BigInt 的正常完成或抛出完成. 将 argument 转换为 BigInt;若需要从 Number 的隐式转换则抛出。 It performs the following steps when called:

  1. prim 为 ? ToPrimitive(argument, number)。
  2. 返回 primTable 12 中对应的值。
Table 12: BigInt 转换
参数类型 结果
Undefined 抛出 TypeError 异常。
Null 抛出 TypeError 异常。
Boolean primtrue 返回 1n,若为 false 返回 0n
BigInt 返回 prim
Number 抛出 TypeError 异常。
String
  1. nStringToBigInt(prim)。
  2. 如果 nundefined,抛出 SyntaxError 异常。
  3. 返回 n
Symbol 抛出 TypeError 异常。

7.1.14 StringToBigInt ( str )

The abstract operation StringToBigInt takes argument str (一个 String) and returns 一个 BigInt 或 undefined. It performs the following steps when called:

  1. literal 为 ParseText(str, StringIntegerLiteral)。
  2. 如果 literal 是一个错误列表,返回 undefined
  3. mvliteral 的 MV。
  4. 断言:mv 是整数。
  5. 返回 (mv)。

7.1.14.1 StringIntegerLiteral 语法

StringToBigInt 使用以下语法。

Syntax

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

7.1.14.2 运行时语义:MV

7.1.15 ToBigInt64 ( argument )

The abstract operation ToBigInt64 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 BigInt 的正常完成或抛出完成. 将 argument 转换为 264 个 BigInt 之一,范围 (-263) 到 (263 - 1)(含)。 It performs the following steps when called:

  1. n 为 ? ToBigInt(argument)。
  2. int64bit(n) modulo 264
  3. 如果 int64bit ≥ 263,返回 (int64bit - 264);否则返回 (int64bit)。

7.1.16 ToBigUint64 ( argument )

The abstract operation ToBigUint64 takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 BigInt 的正常完成或抛出完成. 将 argument 转换为 264 个 BigInt 之一,范围 0(264 - 1)(含)。 It performs the following steps when called:

  1. n 为 ? ToBigInt(argument)。
  2. int64bit(n) modulo 264
  3. 返回 (int64bit)。

7.1.17 ToString ( argument )

The abstract operation ToString takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个 String 的正常完成或抛出完成. 将 argument 转换为 String 类型。 It performs the following steps when called:

  1. 如果 argument 是 String,返回 argument
  2. 如果 argument 是 Symbol,抛出 TypeError 异常。
  3. 如果 argumentundefined,返回 "undefined"
  4. 如果 argumentnull,返回 "null"
  5. 如果 argumenttrue,返回 "true"
  6. 如果 argumentfalse,返回 "false"
  7. 如果 argument 是 Number,返回 Number::toString(argument, 10)。
  8. 如果 argument 是 BigInt,返回 BigInt::toString(argument, 10)。
  9. 断言:argument 是 Object
  10. primValue 为 ? ToPrimitive(argument, string)。
  11. 断言:primValue 不是 Object
  12. 返回 ? ToString(primValue)。

7.1.18 ToObject ( argument )

The abstract operation ToObject takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个 Object 的正常完成或抛出完成. 将 argument 转换为 Object 类型。 It performs the following steps when called:

  1. 如果 argumentundefinednull,抛出 TypeError 异常。
  2. 如果 argument 是 Boolean,返回一个新 Boolean 对象,其 [[BooleanData]] 内部槽设为 argument。详见 20.3
  3. 如果 argument 是 Number,返回一个新 Number 对象,其 [[NumberData]] 设为 argument。详见 21.1
  4. 如果 argument 是 String,返回一个新 String 对象,其 [[StringData]] 设为 argument。详见 22.1
  5. 如果 argument 是 Symbol,返回一个新 Symbol 对象,其 [[SymbolData]] 设为 argument。详见 20.4
  6. 如果 argument 是 BigInt,返回一个新 BigInt 对象,其 [[BigIntData]] 设为 argument。详见 21.2
  7. 断言:argument 是一个 Object。
  8. 返回 argument

7.1.19 ToPropertyKey ( argument )

The abstract operation ToPropertyKey takes argument argument (一个 ECMAScript 语言值) and returns 返回包含一个属性键正常完成或抛出完成. 将 argument 转换为可用作属性键的值。 It performs the following steps when called:

  1. key 为 ? ToPrimitive(argument, string)。
  2. 如果 key 是 Symbol,则
    1. 返回 key
  3. 返回 ! ToString(key)。

7.1.20 ToLength ( argument )

The abstract operation ToLength takes argument argument (一个 ECMAScript 语言值) and returns 返回包含非负整型 Number 的正常完成或抛出完成. 将 argument 钳制并截断为可用于类数组对象 length 的非负整型 Number。 It performs the following steps when called:

  1. len 为 ? ToIntegerOrInfinity(argument)。
  2. 如果 len ≤ 0,返回 +0𝔽
  3. 返回 𝔽(min(len, 253 - 1))。

7.1.21 CanonicalNumericIndexString ( argument )

The abstract operation CanonicalNumericIndexString takes argument argument (一个 String) and returns 一个 Number 或 undefined. 如果 argument"-0" 或者完全匹配某个 Number 值 nToString(n),则返回该 Number 值;否则返回 undefined。 It performs the following steps when called:

  1. 如果 argument"-0",返回 -0𝔽
  2. n 为 ! ToNumber(argument)。
  3. 如果 ! ToString(n) 是 argument,返回 n
  4. 返回 undefined

规范数值字符串是对其执行 CanonicalNumericIndexString 抽象操作不返回 undefined 的任意字符串。

7.1.22 ToIndex ( value )

The abstract operation ToIndex takes argument value (一个 ECMAScript 语言值) and returns 返回包含非负整数的正常完成或抛出完成. 将 value 转换为整数,若其为非负且对应整数索引则返回该整数;否则抛出异常。 It performs the following steps when called:

  1. integer 为 ? ToIntegerOrInfinity(value)。
  2. 如果 integer 不在 0 到 253 - 1(含)内,抛出 RangeError 异常。
  3. 返回 integer

7.2 测试与比较操作 (Testing and Comparison Operations)

7.2.1 RequireObjectCoercible ( argument )

The abstract operation RequireObjectCoercible takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 unused正常完成或抛出完成. 若 argument 不能通过 ToObject 转换为对象则抛出错误。 It performs the following steps when called:

  1. 如果 argumentundefinednull,抛出 TypeError 异常。
  2. 返回 unused

7.2.2 IsArray ( argument )

The abstract operation IsArray takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 Boolean 的正常完成或抛出完成. It performs the following steps when called:

  1. 如果 argument 不是 Object,返回 false
  2. 如果 argument 是 Array exotic object,返回 true
  3. 如果 argument 是 Proxy exotic object,则
    1. 执行 ? ValidateNonRevokedProxy(argument)。
    2. proxyTargetargument.[[ProxyTarget]]
    3. 返回 ? IsArray(proxyTarget)。
  4. 返回 false

7.2.3 IsCallable ( argument )

The abstract operation IsCallable takes argument argument (一个 ECMAScript 语言值) and returns 一个 Boolean. 判断 argument 是否为具有 [[Call]] 内部方法的可调用函数。 It performs the following steps when called:

  1. 如果 argument 不是 Object,返回 false
  2. 如果 argument 具有 [[Call]] 内部方法,返回 true
  3. 返回 false

7.2.4 IsConstructor ( argument )

The abstract operation IsConstructor takes argument argument (一个 ECMAScript 语言值) and returns 一个 Boolean. 判断 argument 是否为具有 [[Construct]] 内部方法的函数对象。 It performs the following steps when called:

  1. 如果 argument 不是 Object,返回 false
  2. 如果 argument 具有 [[Construct]] 内部方法,返回 true
  3. 返回 false

7.2.5 IsExtensible ( O )

The abstract operation IsExtensible takes argument O (一个 Object) and returns 返回包含 Boolean 的正常完成或抛出完成. 用于判断是否可向 O 添加额外属性。 It performs the following steps when called:

  1. 返回 ? O.[[IsExtensible]]()。

7.2.6 IsRegExp ( argument )

The abstract operation IsRegExp takes argument argument (一个 ECMAScript 语言值) and returns 返回包含 Boolean 的正常完成或抛出完成. It performs the following steps when called:

  1. 如果 argument 不是 Object,返回 false
  2. matcher 为 ? Get(argument, %Symbol.match%)。
  3. 如果 matcher 不为 undefined,返回 ToBoolean(matcher)。
  4. 如果 argument[[RegExpMatcher]] 内部槽,返回 true
  5. 返回 false

7.2.7 静态语义: IsStringWellFormedUnicode ( string: 一个 String, ): 一个 Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 将 string 视为 UTF-16 编码的代码点序列(见 6.1.4),判断其是否为 well formed UTF-16 序列。 It performs the following steps when called:

  1. lenstring 的长度。
  2. k 为 0。
  3. 循环,当 k < len
    1. cp 为 CodePointAt(string, k)。
    2. 如果 cp.[[IsUnpairedSurrogate]]true,返回 false
    3. kk + cp.[[CodeUnitCount]]
  4. 返回 true

7.2.8 SameType ( x, y )

The abstract operation SameType takes arguments x (一个 ECMAScript 语言值) and y (一个 ECMAScript 语言值) and returns 一个 Boolean. 判断两个参数是否是相同类型。 It performs the following steps when called:

  1. 如果 xundefinedyundefined,返回 true
  2. 如果 xnullynull,返回 true
  3. 如果 x 是 Boolean 且 y 是 Boolean,返回 true
  4. 如果 x 是 Numbery 是 Number,返回 true
  5. 如果 x 是 BigInty 是 BigInt,返回 true
  6. 如果 x 是 Symbol 且 y 是 Symbol,返回 true
  7. 如果 x 是 String 且 y 是 String,返回 true
  8. 如果 x 是 Objecty 是 Object,返回 true
  9. 返回 false

7.2.9 SameValue ( x, y )

The abstract operation SameValue takes arguments x (一个 ECMAScript 语言值) and y (一个 ECMAScript 语言值) and returns 一个 Boolean. 判断两个参数是否为同一值。 It performs the following steps when called:

  1. 如果 SameType(x, y) 为 false,返回 false
  2. 如果 x 是 Number,则
    1. 返回 Number::sameValue(x, y)。
  3. 返回 SameValueNonNumber(x, y)。
Note

该算法与严格相等算法不同之处在于:它将所有 NaN 视为等价,并区分 +0𝔽-0𝔽

7.2.10 SameValueZero ( x, y )

The abstract operation SameValueZero takes arguments x (一个 ECMAScript 语言值) and y (一个 ECMAScript 语言值) and returns 一个 Boolean. 判断是否为同一值(忽略 +0𝔽-0𝔽 的差别)。 It performs the following steps when called:

  1. 如果 SameType(x, y) 为 false,返回 false
  2. 如果 x 是 Number,则
    1. 返回 Number::sameValueZero(x, y)。
  3. 返回 SameValueNonNumber(x, y)。
Note

SameValueZero 与 SameValue 唯一差别是它认为 +0𝔽-0𝔽 等价。

7.2.11 SameValueNonNumber ( x, y )

The abstract operation SameValueNonNumber takes arguments x (一个 ECMAScript 语言值(非 Number)) and y (一个 ECMAScript 语言值(非 Number)) and returns 一个 Boolean. It performs the following steps when called:

  1. 断言:SameType(x, y) 为 true
  2. 如果 xundefinednull,返回 true
  3. 如果 x 是 BigInt,则
    1. 返回 BigInt::equal(x, y)。
  4. 如果 x 是 String,则
    1. 如果 xy 长度相同且相同位置的代码单元相同,返回 true;否则返回 false
  5. 如果 x 是 Boolean,则
    1. 若都为 true 或都为 false,返回 true;否则返回 false
  6. NOTE: 其他 ECMAScript 语言值按身份比较。
  7. 如果 xy,返回 true;否则返回 false
Note 1
为了阐述目的,本算法中一些分支被单独列出,即便不是必须。
Note 2
xy” 的具体含义详见 5.2.7

7.2.12 IsLessThan ( x, y, LeftFirst )

The abstract operation IsLessThan takes arguments x (一个 ECMAScript 语言值), y (一个 ECMAScript 语言值), and LeftFirst (一个 Boolean) and returns 返回包含 Boolean 或 undefined正常完成,或抛出完成. 提供 x < y 的语义,返回 truefalseundefined(表示至少一个操作数为 NaN)。LeftFirst 标志控制可能具副作用的操作执行顺序,以符合 ECMAScript 自左向右求值规则。若 LeftFirsttruex 对应的表达式位于 y 左侧;否则顺序反转并需先对 y 执行操作。 It performs the following steps when called:

  1. 如果 LeftFirsttrue,则
    1. px 为 ? ToPrimitive(x, number)。
    2. py 为 ? ToPrimitive(y, number)。
  2. 否则,
    1. NOTE: 需反转求值顺序以保持自左向右求值。
    2. py 为 ? ToPrimitive(y, number)。
    3. px 为 ? ToPrimitive(x, number)。
  3. 如果 px 是 String 且 py 是 String,则
    1. lxpx 的长度。
    2. lypy 的长度。
    3. 对每个整数 i,0 ≤ i < min(lx, ly) 递增:
      1. cxpx 索引 i 的代码单元数值。
      2. cypy 索引 i 的代码单元数值。
      3. 如果 cx < cy,返回 true
      4. 如果 cx > cy,返回 false
    4. 如果 lx < ly,返回 true;否则返回 false
  4. 否则,
    1. 如果 px 是 BigIntpy 是 String,则
      1. nyStringToBigInt(py)。
      2. 如果 nyundefined,返回 undefined
      3. 返回 BigInt::lessThan(px, ny)。
    2. 如果 px 是 String 且 py 是 BigInt,则
      1. nxStringToBigInt(px)。
      2. 如果 nxundefined,返回 undefined
      3. 返回 BigInt::lessThan(nx, py)。
    3. NOTE: 因 pxpy 是原始值,求值顺序无关。
    4. nx 为 ? ToNumeric(px)。
    5. ny 为 ? ToNumeric(py)。
    6. 如果 SameType(nx, ny) 为 true,则
      1. 如果 nx 是 Number
        1. 返回 Number::lessThan(nx, ny)。
      2. 否则,
        1. 断言:nx 是 BigInt
        2. 返回 BigInt::lessThan(nx, ny)。
    7. 断言:nx 是 BigIntny 是 Number,或 nx 是 Numberny 是 BigInt
    8. 如果 nxnyNaN,返回 undefined
    9. 如果 nx-∞𝔽ny+∞𝔽,返回 true
    10. 如果 nx+∞𝔽ny-∞𝔽,返回 false
    11. 如果 (nx) < (ny),返回 true;否则返回 false
Note 1

步骤 3 与加法运算符 + 算法 (13.15.3) 中的步骤 1.c 不同之处在于这里使用逻辑与,而非逻辑或。

Note 2

字符串比较使用 UTF-16 代码单元的简单字典序,不使用 Unicode 中更复杂的按语义等价或排序规则。因此按 Unicode 标准规范等价但不同规范化形式的字符串可能判定为不相等;含代理对的字符串按代码单元排序与按代码点排序可能不同。

7.2.13 IsLooselyEqual ( x, y )

The abstract operation IsLooselyEqual takes arguments x (一个 ECMAScript 语言值) and y (一个 ECMAScript 语言值) and returns 返回包含 Boolean 的正常完成或抛出完成. == 运算符的语义。 It performs the following steps when called:

  1. 如果 SameType(x, y) 为 true,则
    1. 返回 IsStrictlyEqual(x, y)。
  2. 如果 xnullyundefined,返回 true
  3. 如果 xundefinedynull,返回 true
  4. Normative Optional
    宿主是 web 浏览器或支持 [[IsHTMLDDA]] 内部槽
    1. x 是 Object、具有 [[IsHTMLDDA]]yundefinednull,返回 true
    2. xundefinednully 是具有 [[IsHTMLDDA]] 的 Object,返回 true
  5. 如果 x 是 Numbery 是 String,返回 ! IsLooselyEqual(x, ! ToNumber(y))。
  6. 如果 x 是 String 且 y 是 Number,返回 ! IsLooselyEqual(! ToNumber(x), y)。
  7. 如果 x 是 BigInty 是 String,则
    1. nStringToBigInt(y)。
    2. 如果 nundefined,返回 false
    3. 返回 ! IsLooselyEqual(x, n)。
  8. 如果 x 是 String 且 y 是 BigInt,返回 ! IsLooselyEqual(y, x)。
  9. 如果 x 是 Boolean,返回 ! IsLooselyEqual(! ToNumber(x), y)。
  10. 如果 y 是 Boolean,返回 ! IsLooselyEqual(x, ! ToNumber(y))。
  11. 如果 x 是 String / Number / BigInt / Symbol 且 y 是 Object,返回 ! IsLooselyEqual(x, ? ToPrimitive(y))。
  12. 如果 x 是 Objecty 是 String / Number / BigInt / Symbol,返回 ! IsLooselyEqual(? ToPrimitive(x), y)。
  13. 如果 (x BigInt 且 y Number) 或 (x Number 且 y BigInt),则
    1. x有限y有限,返回 false
    2. (x) = (y),返回 true;否则返回 false
  14. 返回 false

7.2.14 IsStrictlyEqual ( x, y )

The abstract operation IsStrictlyEqual takes arguments x (一个 ECMAScript 语言值) and y (一个 ECMAScript 语言值) and returns 一个 Boolean. === 运算符的语义。 It performs the following steps when called:

  1. 如果 SameType(x, y) 为 false,返回 false
  2. 如果 x 是 Number,则
    1. 返回 Number::equal(x, y)。
  3. 返回 SameValueNonNumber(x, y)。
Note

该算法与 SameValue 算法在带符号零和 NaN 的处理上不同。

7.3 对象操作 (Operations on Objects)

7.3.1 MakeBasicObject ( internalSlotsList )

The abstract operation MakeBasicObject takes argument internalSlotsList (一个内部槽名称的 List) and returns 一个 Object. 是所有算法创建 ECMAScript 对象(普通或特殊)的基础,它抽出创建所有对象的通用步骤并集中化对象创建。 It performs the following steps when called:

  1. internalSlotsList 设为其与 « [[PrivateElements]] » 的列表拼接
  2. obj 为一个新创建的对象,对 internalSlotsList 中每个名称建一个内部槽。
  3. NOTE: 如 对象的内部方法与内部槽 所述,除非另有说明,每个内部槽初始值为 undefined
  4. 设置 obj.[[PrivateElements]] 为一个新的空 List
  5. obj 的基本内部方法设为 10.1 指定的普通对象默认定义。
  6. 断言:若调用者不会同时覆写 obj[[GetPrototypeOf]][[SetPrototypeOf]],则 internalSlotsList 包含 [[Prototype]]
  7. 断言:若调用者不会全部覆写 obj[[SetPrototypeOf]][[IsExtensible]][[PreventExtensions]],则 internalSlotsList 包含 [[Extensible]]
  8. 如果 internalSlotsList 包含 [[Extensible]],设 obj.[[Extensible]]true
  9. 返回 obj
Note

在本规范中,特殊对象(exotic objects)通过如 ArrayCreateBoundFunctionCreate抽象操作创建:先调用 MakeBasicObject 得到基础对象,再覆写其部分或全部内部方法。为封装特殊对象创建,其基本内部方法不会在这些操作之外被修改。

7.3.2 Get ( O, P )

The abstract operation Get takes arguments O (一个 Object) and P (一个属性键) and returns 返回包含一个 ECMAScript 语言值正常完成或抛出完成. 用于获取对象特定属性的值。 It performs the following steps when called:

  1. 返回 ? O.[[Get]](P, O)。

7.3.3 GetV ( V, P )

The abstract operation GetV takes arguments V (一个 ECMAScript 语言值) and P (一个属性键) and returns 返回包含一个 ECMAScript 语言值正常完成或抛出完成. 用于获取一个 ECMAScript 语言值特定属性的值;若该值不是对象,则通过类型对应的包装对象执行属性查找。 It performs the following steps when called:

  1. O 为 ? ToObject(V)。
  2. 返回 ? O.[[Get]](P, V)。

7.3.4 Set ( O, P, V, Throw )

The abstract operation Set takes arguments O (一个 Object), P (一个属性键), V (一个 ECMAScript 语言值), and Throw (一个 Boolean) and returns 返回包含 unused正常完成或抛出完成. 设置对象特定属性的值,V 是新值。 It performs the following steps when called:

  1. success 为 ? O.[[Set]](P, V, O)。
  2. successfalseThrowtrue,抛出 TypeError
  3. 返回 unused

7.3.5 CreateDataProperty ( O, P, V )

The abstract operation CreateDataProperty takes arguments O (一个 Object), P (一个属性键), and V (一个 ECMAScript 语言值) and returns 返回包含 Boolean 的正常完成或抛出完成. 创建对象的一个新的自身属性。 It performs the following steps when called:

  1. newDesc 为 PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。
  2. 返回 ? O.[[DefineOwnProperty]](P, newDesc)。
Note

此操作创建的属性特性与语言赋值运算符新建属性时的默认特性相同。通常该属性不存在;若已存在且不可配置,或 O 不可扩展,则 [[DefineOwnProperty]] 返回 false

7.3.6 CreateDataPropertyOrThrow ( O, P, V )

The abstract operation CreateDataPropertyOrThrow takes arguments O (一个 Object), P (一个属性键), and V (一个 ECMAScript 语言值) and returns 返回包含 unused正常完成或抛出完成. 创建对象一个新的自身属性。如果该属性更新无法执行则抛出 TypeError。 It performs the following steps when called:

  1. success 为 ? CreateDataProperty(O, P, V)。
  2. successfalse,抛出 TypeError
  3. 返回 unused
Note

CreateDataProperty 类似,但失败时抛出异常。

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O, P, V )

The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments O (一个 Object), P (一个属性键), and V (一个 ECMAScript 语言值) and returns unused. 创建一个新的不可枚举自身数据属性普通对象)。 It performs the following steps when called:

  1. 断言:O 是可扩展、普通对象,且无不可配置属性。
  2. newDesc 为 PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。
  3. 执行 ! DefinePropertyOrThrow(O, P, newDesc)。
  4. 返回 unused
Note

特性与赋值运算符默认值相同,唯独 [[Enumerable]]false

7.3.8 DefinePropertyOrThrow ( O, P, desc )

The abstract operation DefinePropertyOrThrow takes arguments O (一个 Object), P (一个属性键), and desc (一个 Property Descriptor) and returns 返回包含 unused正常完成或抛出完成. 以会在失败时抛出 TypeError 的方式调用对象的 [[DefineOwnProperty]]。 It performs the following steps when called:

  1. success 为 ? O.[[DefineOwnProperty]](P, desc)。
  2. successfalse,抛出 TypeError
  3. 返回 unused

7.3.9 DeletePropertyOrThrow ( O, P )

The abstract operation DeletePropertyOrThrow takes arguments O (一个 Object) and P (一个属性键) and returns 返回包含 unused正常完成或抛出完成. 移除对象的指定自身属性;若属性不可配置则抛出异常。 It performs the following steps when called:

  1. success 为 ? O.[[Delete]](P)。
  2. successfalse,抛出 TypeError
  3. 返回 unused

7.3.10 GetMethod ( V, P )

The abstract operation GetMethod takes arguments V (一个 ECMAScript 语言值) and P (一个属性键) and returns 返回包含函数对象undefined正常完成,或抛出完成. 获取一个 ECMAScript 语言值的指定属性值,并期望其为函数。 It performs the following steps when called:

  1. func 为 ? GetV(V, P)。
  2. 如果 funcundefinednull,返回 undefined
  3. 如果 IsCallable(func) 为 false,抛出 TypeError
  4. 返回 func

7.3.11 HasProperty ( O, P )

The abstract operation HasProperty takes arguments O (一个 Object) and P (一个属性键) and returns 返回包含 Boolean 的正常完成或抛出完成. 判断对象是否具有指定键的属性(自身或继承)。 It performs the following steps when called:

  1. 返回 ? O.[[HasProperty]](P)。

7.3.12 HasOwnProperty ( O, P )

The abstract operation HasOwnProperty takes arguments O (一个 Object) and P (一个属性键) and returns 返回包含 Boolean 的正常完成或抛出完成. 判断对象是否具有指定键的自身属性。 It performs the following steps when called:

  1. desc 为 ? O.[[GetOwnProperty]](P)。
  2. 如果 descundefined,返回 false
  3. 返回 true

7.3.13 Call ( F: 一个 ECMAScript 语言值, V: 一个 ECMAScript 语言值, 可选 argumentsList: 一个 ECMAScript 语言值的 List, ): 返回包含一个 ECMAScript 语言值的正常完成或抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 调用函数对象[[Call]] 内部方法。F函数对象Vthis 值,argumentsList 为传递的参数列表。若 argumentsList 不存在,使用新的空 List。 It performs the following steps when called:

  1. argumentsList 不存在,设其为新空 List
  2. IsCallable(F) 为 false,抛出 TypeError
  3. 返回 ? F.[[Call]](V, argumentsList)。

7.3.14 Construct ( F: 一个 constructor, 可选 argumentsList: ECMAScript 语言值 List, 可选 newTarget: 一个 constructor, ): 返回包含一个 Object 的正常完成或抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 调用函数对象[[Construct]] 内部方法。argumentsListnewTarget 为对应参数;若 argumentsList 缺省,用新空 List;若 newTarget 缺省,用 F。 It performs the following steps when called:

  1. newTarget 不存在,设为 F
  2. argumentsList 不存在,设为新空 List
  3. 返回 ? F.[[Construct]](argumentsList, newTarget)。
Note

newTarget 不存在,等价于:new F(...argumentsList)

7.3.15 SetIntegrityLevel ( O, level )

The abstract operation SetIntegrityLevel takes arguments O (一个 Object) and level (sealedfrozen) and returns 返回包含 Boolean 的正常完成或抛出完成. 固定对象自身属性集合。 It performs the following steps when called:

  1. status 为 ? O.[[PreventExtensions]]()。
  2. statusfalse,返回 false
  3. keys 为 ? O.[[OwnPropertyKeys]]()。
  4. 如果 levelsealed,则
    1. keys 中每个 k
      1. 执行 ? DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false })。
  5. 否则,
    1. 断言:levelfrozen
    2. keys 中每个 k
      1. currentDesc 为 ? O.[[GetOwnProperty]](k)。
      2. currentDesc 不为 undefined,则
        1. 如果 IsAccessorDescriptor(currentDesc) 为 true
          1. desc 为 PropertyDescriptor { [[Configurable]]: false }。
        2. 否则,
          1. desc 为 PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false }。
        3. 执行 ? DefinePropertyOrThrow(O, k, desc)。
  6. 返回 true

7.3.16 TestIntegrityLevel ( O, level )

The abstract operation TestIntegrityLevel takes arguments O (一个 Object) and level (sealedfrozen) and returns 返回包含 Boolean 的正常完成或抛出完成. 判断对象自身属性集合是否已固定。 It performs the following steps when called:

  1. extensible 为 ? IsExtensible(O)。
  2. extensibletrue,返回 false
  3. NOTE: 若对象可扩展,不检查属性。
  4. keys 为 ? O.[[OwnPropertyKeys]]()。
  5. keys 中每个 k
    1. currentDesc 为 ? O.[[GetOwnProperty]](k)。
    2. currentDesc 不为 undefined,则
      1. currentDesc.[[Configurable]]true,返回 false
      2. levelfrozenIsDataDescriptor(currentDesc) 为 true,则
        1. currentDesc.[[Writable]]true,返回 false
  6. 返回 true

7.3.17 CreateArrayFromList ( elements )

The abstract operation CreateArrayFromList takes argument elements (一个 ECMAScript 语言值List) and returns 一个 Array. 创建一个其元素由 elements 提供的数组。 It performs the following steps when called:

  1. array 为 ! ArrayCreate(0)。
  2. n 为 0。
  3. elements 中每个 e
    1. 执行 ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), e)。
    2. nn + 1。
  4. 返回 array

7.3.18 LengthOfArrayLike ( obj )

The abstract operation LengthOfArrayLike takes argument obj (一个 Object) and returns 返回包含非负整数的正常完成或抛出完成. 返回类数组对象 "length" 属性的值。 It performs the following steps when called:

  1. 返回 (? ToLength(? Get(obj, "length"))).

类数组对象 指此操作能正常完成的任意对象。

Note 1
通常类数组对象也具有一些整型索引属性,但这不是定义要求。
Note 2
Array 和 String 对象是类数组对象的例子。

7.3.19 CreateListFromArrayLike ( obj: 一个 ECMAScript 语言值, 可选 validElementTypes: allproperty-key, ): 返回包含 ECMAScript 语言值 List 的正常完成或抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 创建一个 List,其元素由 obj 的按索引属性提供;validElementTypes 指定允许的元素类型。 It performs the following steps when called:

  1. validElementTypes 不存在,设为 all
  2. obj 不是 Object,抛出 TypeError
  3. len 为 ? LengthOfArrayLike(obj)。
  4. list 为新空 List
  5. index 为 0。
  6. index < len
    1. indexName 为 ! ToString(𝔽(index))。
    2. next 为 ? Get(obj, indexName)。
    3. validElementTypesproperty-keynext 不是属性键,抛出 TypeError
    4. next 附加到 list
    5. indexindex + 1。
  7. 返回 list

7.3.20 Invoke ( V: 一个 ECMAScript 语言值, P: 一个属性键, 可选 argumentsList: ECMAScript 语言值 List, ): 返回包含一个 ECMAScript 语言值的正常完成或抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 调用一个 ECMAScript 语言值的方法属性,V 既作为查找点又作为 this 值。argumentsList 为传入参数,缺省用空 List。 It performs the following steps when called:

  1. argumentsList 不存在,设为新空 List
  2. func 为 ? GetV(V, P)。
  3. 返回 ? Call(func, V, argumentsList)。

7.3.21 OrdinaryHasInstance ( C, O )

The abstract operation OrdinaryHasInstance takes arguments C (一个 ECMAScript 语言值) and O (一个 ECMAScript 语言值) and returns 返回包含 Boolean 的正常完成或抛出完成. 实现默认算法:判断 O 是否继承自 C 提供的实例继承路径。 It performs the following steps when called:

  1. IsCallable(C) 为 false,返回 false
  2. C[[BoundTargetFunction]] 内部槽,则
    1. BCC.[[BoundTargetFunction]]
    2. 返回 ? InstanceofOperator(O, BC)。
  3. O 不是 Object,返回 false
  4. P 为 ? Get(C, "prototype")。
  5. P 不是 Object,抛出 TypeError
  6. 循环:
    1. O 为 ? O.[[GetPrototypeOf]]()。
    2. Onull,返回 false
    3. SameValue(P, O) 为 true,返回 true

7.3.22 SpeciesConstructor ( O, defaultConstructor )

The abstract operation SpeciesConstructor takes arguments O (一个 Object) and defaultConstructor (一个 constructor) and returns 返回包含 constructor 的正常完成或抛出完成. 获取用于创建从 O 派生的新对象的构造函数;若从 O 开始找不到 %Symbol.species% 属性则使用 defaultConstructor。 It performs the following steps when called:

  1. C 为 ? Get(O, "constructor")。
  2. Cundefined,返回 defaultConstructor
  3. C 不是 Object,抛出 TypeError
  4. S 为 ? Get(C, %Symbol.species%)。
  5. Sundefinednull,返回 defaultConstructor
  6. IsConstructor(S) 为 true,返回 S
  7. 抛出 TypeError

7.3.23 EnumerableOwnProperties ( O, kind )

The abstract operation EnumerableOwnProperties takes arguments O (一个 Object) and kind (key, value, 或 key+value) and returns 返回包含 ECMAScript 语言值 List正常完成或抛出完成. It performs the following steps when called:

  1. ownKeys 为 ? O.[[OwnPropertyKeys]]()。
  2. results 为新空 List
  3. ownKeys 中每个 key
    1. 如果 key 是 String,则
      1. desc 为 ? O.[[GetOwnProperty]](key)。
      2. desc 不为 undefineddesc.[[Enumerable]]true,则
        1. 如果 kindkey
          1. key 加入 results
        2. 否则,
          1. value 为 ? Get(O, key)。
          2. kindvalue
            1. value 加入 results
          3. 否则,
            1. 断言:kindkey+value
            2. entryCreateArrayFromListkey, value »)。
            3. entry 加入 results
  4. 返回 results

7.3.24 GetFunctionRealm ( obj )

The abstract operation GetFunctionRealm takes argument obj (一个函数对象) and returns 返回包含 Realm Record正常完成或抛出完成. It performs the following steps when called:

  1. obj[[Realm]] 内部槽,
    1. 返回 obj.[[Realm]]
  2. obj 是绑定函数特殊对象
    1. boundTargetFunctionobj.[[BoundTargetFunction]]
    2. 返回 ? GetFunctionRealm(boundTargetFunction)。
  3. obj 是 Proxy 特殊对象
    1. 执行 ? ValidateNonRevokedProxy(obj)。
    2. proxyTargetobj.[[ProxyTarget]]
    3. 断言:proxyTarget函数对象
    4. 返回 ? GetFunctionRealm(proxyTarget)。
  4. 返回当前 Realm Record
Note

仅当 obj 是无 [[Realm]] 内部槽的非标准函数特殊对象时才会到达步骤 4

7.3.25 CopyDataProperties ( target, source, excludedItems )

The abstract operation CopyDataProperties takes arguments target (一个 Object), source (一个 ECMAScript 语言值), and excludedItems (一个属性键List) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. 如果 sourceundefinednull,返回 unused
  2. from 为 ! ToObject(source)。
  3. keys 为 ? from.[[OwnPropertyKeys]]()。
  4. keys 中每个 nextKey
    1. excludedfalse
    2. excludedItems 中每个 e
      1. SameValue(e, nextKey) 为 true
        1. excludedtrue
    3. excludedfalse,则
      1. desc 为 ? from.[[GetOwnProperty]](nextKey)。
      2. desc 不为 undefineddesc.[[Enumerable]]true
        1. propValue 为 ? Get(from, nextKey)。
        2. 执行 ! CreateDataPropertyOrThrow(target, nextKey, propValue)。
  5. 返回 unused
Note

此处的 target 总是新创建且在抛错情况下不可被直接访问。

7.3.26 PrivateElementFind ( O, P )

The abstract operation PrivateElementFind takes arguments O (一个 Object) and P (一个 Private Name) and returns 一个 PrivateElementempty. It performs the following steps when called:

  1. 如果 O.[[PrivateElements]] 包含 PrivateElement pepe.[[Key]]P
    1. 返回 pe
  2. 返回 empty

7.3.27 PrivateFieldAdd ( O, P, value )

The abstract operation PrivateFieldAdd takes arguments O (一个 Object), P (一个 Private Name), and value (一个 ECMAScript 语言值) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. 宿主是 web 浏览器,
    1. 执行 ? HostEnsureCanAddPrivateElement(O)。
  2. entryPrivateElementFind(O, P)。
  3. entry 不为 empty,抛出 TypeError
  4. PrivateElement { [[Key]]: P, [[Kind]]: field, [[Value]]: value } 附加到 O.[[PrivateElements]]
  5. 返回 unused

7.3.28 PrivateMethodOrAccessorAdd ( O, method )

The abstract operation PrivateMethodOrAccessorAdd takes arguments O (一个 Object) and method (一个 PrivateElement) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. 断言:method.[[Kind]]methodaccessor
  2. 宿主是 web 浏览器,
    1. 执行 ? HostEnsureCanAddPrivateElement(O)。
  3. entryPrivateElementFind(O, method.[[Key]])。
  4. entry 不为 empty,抛出 TypeError
  5. method 附加到 O.[[PrivateElements]]
  6. 返回 unused
Note

私有方法与访问器的值在实例之间共享,不会为每个实例复制。

7.3.29 HostEnsureCanAddPrivateElement ( O )

The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument O (一个 Object) and returns 返回包含 unused正常完成或抛出完成. 允许宿主环境阻止某些宿主定义特殊对象添加私有元素。

实现需符合:

默认实现为返回 NormalCompletion(unused)。

仅由作为 web 浏览器的 ECMAScript 宿主调用。

7.3.30 PrivateGet ( O, P )

The abstract operation PrivateGet takes arguments O (一个 Object) and P (一个 Private Name) and returns 返回包含一个 ECMAScript 语言值正常完成或抛出完成. It performs the following steps when called:

  1. entryPrivateElementFind(O, P)。
  2. entryempty,抛出 TypeError
  3. entry.[[Kind]]fieldmethod
    1. 返回 entry.[[Value]]
  4. 断言:entry.[[Kind]]accessor
  5. entry.[[Get]]undefined,抛出 TypeError
  6. getterentry.[[Get]]
  7. 返回 ? Call(getter, O)。

7.3.31 PrivateSet ( O, P, value )

The abstract operation PrivateSet takes arguments O (一个 Object), P (一个 Private Name), and value (一个 ECMAScript 语言值) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. entryPrivateElementFind(O, P)。
  2. entryempty,抛出 TypeError
  3. entry.[[Kind]]field,则
    1. entry.[[Value]]value
  4. 否则如果 entry.[[Kind]]method
    1. 抛出 TypeError
  5. 否则,
    1. 断言:entry.[[Kind]]accessor
    2. entry.[[Set]]undefined,抛出 TypeError
    3. setterentry.[[Set]]
    4. 执行 ? Call(setter, O, « value »)。
  6. 返回 unused

7.3.32 DefineField ( receiver, fieldRecord )

The abstract operation DefineField takes arguments receiver (一个 Object) and fieldRecord (一个 ClassFieldDefinition Record) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. fieldNamefieldRecord.[[Name]]
  2. initializerfieldRecord.[[Initializer]]
  3. 如果 initializer 不是 empty
    1. initValue 为 ? Call(initializer, receiver)。
  4. 否则,
    1. initValueundefined
  5. fieldNamePrivate Name
    1. 执行 ? PrivateFieldAdd(receiver, fieldName, initValue)。
  6. 否则,
    1. 断言:fieldName属性键
    2. 执行 ? CreateDataPropertyOrThrow(receiver, fieldName, initValue)。
  7. 返回 unused

7.3.33 InitializeInstanceElements ( O, constructor )

The abstract operation InitializeInstanceElements takes arguments O (一个 Object) and constructor (一个 ECMAScript 函数对象) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. methodsconstructor.[[PrivateMethods]]
  2. methods 中每个 PrivateElement method
    1. 执行 ? PrivateMethodOrAccessorAdd(O, method)。
  3. fieldsconstructor.[[Fields]]
  4. fields 中每个 fieldRecord
    1. 执行 ? DefineField(O, fieldRecord)。
  5. 返回 unused

7.3.34 AddValueToKeyedGroup ( groups, key, value )

The abstract operation AddValueToKeyedGroup takes arguments groups (一个包含 [[Key]] (ECMAScript 语言值) 与 [[Elements]] (值 List) 字段的 Record List), key (一个 ECMAScript 语言值), and value (一个 ECMAScript 语言值) and returns unused. It performs the following steps when called:

  1. groups 中每个 Record { [[Key]], [[Elements]] } g
    1. SameValue(g.[[Key]], key) 为 true,则
      1. 断言:恰有一个元素符合。
      2. value 加入 g.[[Elements]]
      3. 返回 unused
  2. groupRecord { [[Key]]: key, [[Elements]]: « value » }。
  3. group 加入 groups
  4. 返回 unused

7.3.35 GroupBy ( items, callback, keyCoercion )

The abstract operation GroupBy takes arguments items (一个 ECMAScript 语言值), callback (一个 ECMAScript 语言值), and keyCoercion (propertycollection) and returns 返回包含带 [[Key]][[Elements]] 字段的 Record List正常完成,或抛出完成. It performs the following steps when called:

  1. 执行 ? RequireObjectCoercible(items)。
  2. IsCallable(callback) 为 false,抛出 TypeError
  3. groups 为新空 List
  4. iteratorRecord 为 ? GetIterator(items, sync)。
  5. k 为 0。
  6. 循环:
    1. k ≥ 253 - 1,则
      1. errorThrowCompletion(新建 TypeError 对象)。
      2. 返回 ? IteratorClose(iteratorRecord, error)。
    2. next 为 ? IteratorStepValue(iteratorRecord)。
    3. nextdone
      1. 返回 groups
    4. valuenext
    5. keyCompletion(Call(callback, undefined, « value, 𝔽(k) »))。
    6. IfAbruptCloseIterator(key, iteratorRecord)。
    7. keyCoercionproperty,则
      1. keyCompletion(ToPropertyKey(key))。
      2. IfAbruptCloseIterator(key, iteratorRecord)。
    8. 否则,
      1. 断言:keyCoercioncollection
      2. keyCanonicalizeKeyedCollectionKey(key)。
    9. 执行 AddValueToKeyedGroup(groups, key, value)。
    10. kk + 1。

7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue, home, p, v )

The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (一个 ECMAScript 语言值), home (一个 Object), p (一个属性键), and v (一个 ECMAScript 语言值) and returns 返回包含 unused正常完成或抛出完成. It performs the following steps when called:

  1. 如果 thisValue 不是 Object
    1. 抛出 TypeError
  2. 如果 SameValue(thisValue, home) 为 true
    1. NOTE: 此处抛出模拟在严格模式下给 home 不可写数据属性赋值。
    2. 抛出 TypeError
  3. desc 为 ? thisValue.[[GetOwnProperty]](p)。
  4. descundefined
    1. 执行 ? CreateDataPropertyOrThrow(thisValue, p, v)。
  5. 否则,
    1. 执行 ? Set(thisValue, p, v, true)。
  6. 返回 unused

7.4 迭代器对象操作 (Operations on Iterator Objects)

参见通用迭代接口 (27.1)。

7.4.1 Iterator Records

Iterator Record 是一个 Record,用于封装迭代器或异步迭代器及其 next 方法。

Iterator Record 拥有 Table 13 所列字段。

Table 13: Iterator Record 字段
字段名 含义
[[Iterator]] 一个 Object 符合迭代器或异步迭代器接口的对象。
[[NextMethod]] 一个 ECMAScript 语言值 [[Iterator]] 对象的 next 方法。
[[Done]] 一个 Boolean 迭代器是否已完成或被关闭。

7.4.2 GetIteratorDirect ( obj )

The abstract operation GetIteratorDirect takes argument obj (一个 Object) and returns 返回包含 Iterator Record正常完成或抛出完成. It performs the following steps when called:

  1. nextMethod 为 ? Get(obj, "next")。
  2. iteratorRecordIterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false }。
  3. 返回 iteratorRecord

7.4.3 GetIteratorFromMethod ( obj, method )

The abstract operation GetIteratorFromMethod takes arguments obj (一个 ECMAScript 语言值) and method (一个函数对象) and returns 返回包含 Iterator Record正常完成或抛出完成. It performs the following steps when called:

  1. iterator 为 ? Call(method, obj)。
  2. iterator 不是 Object,抛出 TypeError
  3. 返回 ? GetIteratorDirect(iterator)。

7.4.4 GetIterator ( obj, kind )

The abstract operation GetIterator takes arguments obj (一个 ECMAScript 语言值) and kind (syncasync) and returns 返回包含 Iterator Record正常完成或抛出完成. It performs the following steps when called:

  1. kindasync,则
    1. method 为 ? GetMethod(obj, %Symbol.asyncIterator%)。
    2. methodundefined,则
      1. syncMethod 为 ? GetMethod(obj, %Symbol.iterator%)。
      2. syncMethodundefined,抛出 TypeError
      3. syncIteratorRecord 为 ? GetIteratorFromMethod(obj, syncMethod)。
      4. 返回 CreateAsyncFromSyncIterator(syncIteratorRecord)。
  2. 否则,
    1. method 为 ? GetMethod(obj, %Symbol.iterator%)。
  3. methodundefined,抛出 TypeError
  4. 返回 ? GetIteratorFromMethod(obj, method)。

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

The abstract operation GetIteratorFlattenable takes arguments obj (一个 ECMAScript 语言值) and primitiveHandling (iterate-string-primitivesreject-primitives) and returns 返回包含 Iterator Record正常完成或抛出完成. It performs the following steps when called:

  1. obj 不是 Object,则
    1. primitiveHandlingreject-primitives,抛出 TypeError
    2. 断言:primitiveHandlingiterate-string-primitives
    3. obj 不是 String,抛出 TypeError
  2. method 为 ? GetMethod(obj, %Symbol.iterator%)。
  3. methodundefined
    1. iteratorobj
  4. 否则,
    1. iterator 为 ? Call(method, obj)。
  5. iterator 不是 Object,抛出 TypeError
  6. 返回 ? GetIteratorDirect(iterator)。

7.4.6 IteratorNext ( iteratorRecord: 一个 Iterator Record, 可选 value: 一个 ECMAScript 语言值, ): 返回包含一个 Object 的正常完成或抛出完成

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. 如果 value 不存在,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]))。
  2. 否则,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »))。
  3. result 是 throw completion,
    1. iteratorRecord.[[Done]]true
    2. 返回 ? result
  4. result 为 ! result
  5. result 不是 Object
    1. iteratorRecord.[[Done]]true
    2. 抛出 TypeError
  6. 返回 result

7.4.7 IteratorComplete ( iteratorResult )

The abstract operation IteratorComplete takes argument iteratorResult (一个 Object) and returns 返回包含 Boolean 的正常完成或抛出完成. It performs the following steps when called:

  1. 返回 ToBoolean(? Get(iteratorResult, "done"))。

7.4.8 IteratorValue ( iteratorResult )

The abstract operation IteratorValue takes argument iteratorResult (一个 Object) and returns 返回包含一个 ECMAScript 语言值正常完成或抛出完成. It performs the following steps when called:

  1. 返回 ? Get(iteratorResult, "value")。

7.4.9 IteratorStep ( iteratorRecord )

The abstract operation IteratorStep takes argument iteratorRecord (一个 Iterator Record) and returns 返回包含一个 Object 或 done正常完成或抛出完成. 调用 iteratorRecord.[[NextMethod]] 请求下一个值;若迭代结束返回 done,否则返回 IteratorResult 对象。 It performs the following steps when called:

  1. result 为 ? IteratorNext(iteratorRecord)。
  2. doneCompletion(IteratorComplete(result))。
  3. done 是 throw completion,
    1. iteratorRecord.[[Done]]true
    2. 返回 ? done
  4. done 为 ! done
  5. donetrue
    1. iteratorRecord.[[Done]]true
    2. 返回 done
  6. 返回 result

7.4.10 IteratorStepValue ( iteratorRecord )

The abstract operation IteratorStepValue takes argument iteratorRecord (一个 Iterator Record) and returns 返回包含 ECMAScript 语言值done正常完成,或抛出完成. 与 IteratorStep 类似,但若有值则直接返回值,否则 done。 It performs the following steps when called:

  1. result 为 ? IteratorStep(iteratorRecord)。
  2. resultdone
    1. 返回 done
  3. valueCompletion(IteratorValue(result))。
  4. value 是 throw completion,
    1. iteratorRecord.[[Done]]true
  5. 返回 ? value

7.4.11 IteratorClose ( iteratorRecord, completion )

The abstract operation IteratorClose takes arguments iteratorRecord (一个 Iterator Record) and completion (一个 Completion Record) and returns 一个 Completion Record. 通知迭代器执行其完成状态下的收尾动作。 It performs the following steps when called:

  1. 断言:iteratorRecord.[[Iterator]] 是 Object
  2. iteratoriteratorRecord.[[Iterator]]
  3. innerResultCompletion(GetMethod(iterator, "return"))。
  4. innerResult 是 normal completion,
    1. returninnerResult.[[Value]]
    2. returnundefined,返回 ? completion
    3. innerResultCompletion(Call(return, iterator))。
  5. completion 是 throw completion,返回 ? completion
  6. innerResult 是 throw completion,返回 ? innerResult
  7. innerResult.[[Value]] 不是 Object,抛出 TypeError
  8. 返回 ? completion

7.4.12 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator 是使用 Iterator Record 相关步骤的简写。形如:

  1. IfAbruptCloseIterator(value, iteratorRecord)。

等价于:

  1. 断言:valueCompletion Record
  2. value 是 abrupt completion,返回 ? IteratorClose(iteratorRecord, value)。
  3. 否则,设 value 为 ! value

7.4.13 AsyncIteratorClose ( iteratorRecord, completion )

The abstract operation AsyncIteratorClose takes arguments iteratorRecord (一个 Iterator Record) and completion (一个 Completion Record) and returns 一个 Completion Record. 通知异步迭代器执行其完成状态下的收尾动作。 It performs the following steps when called:

  1. 断言:iteratorRecord.[[Iterator]] 是 Object
  2. iteratoriteratorRecord.[[Iterator]]
  3. innerResultCompletion(GetMethod(iterator, "return"))。
  4. innerResult 是 normal completion,
    1. returninnerResult.[[Value]]
    2. returnundefined,返回 ? completion
    3. innerResultCompletion(Call(return, iterator))。
    4. innerResult 是 normal completion,设其为 Completion(Await(innerResult.[[Value]]))。
  5. completion 是 throw completion,返回 ? completion
  6. innerResult 是 throw completion,返回 ? innerResult
  7. innerResult.[[Value]] 不是 Object,抛出 TypeError
  8. 返回 ? completion

7.4.14 CreateIteratorResultObject ( value, done )

The abstract operation CreateIteratorResultObject takes arguments value (一个 ECMAScript 语言值) and done (一个 Boolean) and returns 一个符合 IteratorResult 接口的 Object. 创建一个符合 IteratorResult 接口的对象。 It performs the following steps when called:

  1. objOrdinaryObjectCreate(%Object.prototype%)。
  2. 执行 ! CreateDataPropertyOrThrow(obj, "value", value)。
  3. 执行 ! CreateDataPropertyOrThrow(obj, "done", done)。
  4. 返回 obj

7.4.15 CreateListIteratorRecord ( list )

The abstract operation CreateListIteratorRecord takes argument list (一个 ECMAScript 语言值List) and returns 一个 Iterator Record. 创建一个 Iterator Record,其 [[NextMethod]] 依次返回 list 的元素。 It performs the following steps when called:

  1. closure 为一个新建的 Abstract Closure(无参数),捕获 list,被调用时:
    1. list 中每个 E
      1. 执行 ? GeneratorYield(CreateIteratorResultObject(E, false))。
    2. 返回 NormalCompletion(undefined)。
  2. iteratorCreateIteratorFromClosure(closure, empty, %Iterator.prototype%)。
  3. 返回 Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false }。
Note

该列表迭代器对象对 ECMAScript 代码不可直接访问。

7.4.16 IteratorToList ( iteratorRecord )

The abstract operation IteratorToList takes argument iteratorRecord (一个 Iterator Record) and returns 返回包含 ECMAScript 语言值 List正常完成或抛出完成. It performs the following steps when called:

  1. values 为新空 List
  2. 循环:
    1. next 为 ? IteratorStepValue(iteratorRecord)。
    2. nextdone
      1. 返回 values
    3. next 加入 values