页面模式偏好

20 基本对象

20.1 Object 对象

20.1.1 Object 构造函数

Object 构造函数:

20.1.1.1 Object ( value )

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

  1. 如果 NewTarget 既不是 undefined 也不是活动函数对象,则
    1. 返回 ? OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%")。
  2. 如果 value 是 undefined 或 null,则返回 OrdinaryObjectCreate(%Object.prototype%)。
  3. 返回 ! ToObject(value)。

20.1.2 Object 构造函数的属性

Object 构造函数:

20.1.2.1 Object.assign ( target, ...sources )

此函数将一个或多个源对象的所有可枚举自有属性值复制到 target 对象。

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

  1. 令 targetObj 为 ? ToObject(target)。
  2. 如果只传递了一个参数,则返回 targetObj。
  3. 对 sources 的每个元素 nextSource,执行
    1. 如果 nextSource 既不是 undefined 也不是 null,则
      1. 令 from 为 ! ToObject(nextSource)。
      2. 令 keys 为 ? from.[[OwnPropertyKeys]]()。
      3. 对 keys 的每个元素 nextKey,执行
        1. 令 propertyDesc 为 ? from.[[GetOwnProperty]](nextKey)。
        2. 如果 propertyDesc 不是 undefined 且 propertyDesc.[[Enumerable]] 是 true,则
          1. 令 propertyValue 为 ? Get(from, nextKey)。
          2. 执行 ? Set(targetObj, nextKey, propertyValue, true)。
  4. 返回 targetObj。

此函数的 "length" 属性为 2𝔽。

20.1.2.2 Object.create ( proto, properties )

此函数使用指定的原型创建新对象。

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

  1. 如果 proto 不是 Object 且 proto 不是 null,则抛出 TypeError 异常。
  2. 令 obj 为 OrdinaryObjectCreate(proto)。
  3. 如果 properties 不是 undefined,则
    1. 返回 ? ObjectDefineProperties(obj, properties)。
  4. 返回 obj。

20.1.2.3 Object.defineProperties ( obj, properties )

此函数添加自有属性和/或更新对象现有自有属性的特性。

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

  1. 如果 obj 不是 Object,则抛出 TypeError 异常。
  2. 返回 ? ObjectDefineProperties(obj, properties)。

20.1.2.3.1 ObjectDefineProperties ( obj, properties )

抽象操作 ObjectDefineProperties,接收参数 obj (Object) 和 properties (ECMAScript 语言值);返回值:(正常完成 (值:Object) 或 抛出完成)。 调用时执行以下步骤:

  1. 将 properties 设置为 ? ToObject(properties)。
  2. 令 keys 为 ? properties.[[OwnPropertyKeys]]()。
  3. 令 propertyDescs 为新的空 List。
  4. 对 keys 的每个元素 nextKey,执行
    1. 令 currentPropertyDesc 为 ? properties.[[GetOwnProperty]](nextKey)。
    2. 如果 currentPropertyDesc 不是 undefined 且 currentPropertyDesc.[[Enumerable]] 是 true,则
      1. 令 propertyDescObj 为 ? Get(properties, nextKey)。
      2. 令 propertyDesc 为 ? ToPropertyDescriptor(propertyDescObj)。
      3. 将 Record { [[Key]]: nextKey, [[Descriptor]]: propertyDesc } 追加到 propertyDescs。
  5. 对 propertyDescs 的每个元素 property,执行
    1. 执行 ? DefinePropertyOrThrow(obj, property.[[Key]], property.[[Descriptor]])。
  6. 返回 obj。

20.1.2.4 Object.defineProperty ( obj, key, attrs )

此函数添加自有属性和/或更新对象现有自有属性的特性。

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

  1. 如果 obj 不是 Object,则抛出 TypeError 异常。
  2. 令 propertyKey 为 ? ToPropertyKey(key)。
  3. 令 propertyDesc 为 ? ToPropertyDescriptor(attrs)。
  4. 执行 ? DefinePropertyOrThrow(obj, propertyKey, propertyDesc)。
  5. 返回 obj。

20.1.2.5 Object.entries ( obj )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 entryList 为 ? EnumerableOwnProperties(coerced, key+value)。
  3. 返回 CreateArrayFromList(entryList)。

20.1.2.6 Object.freeze ( obj )

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

  1. 如果 obj 不是 Object,则返回 obj。
  2. 令 status 为 ? SetIntegrityLevel(obj, frozen)。
  3. 如果 status 是 false,则抛出 TypeError 异常。
  4. 返回 obj。

20.1.2.7 Object.fromEntries ( iterable )

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

  1. 执行 ? RequireObjectCoercible(iterable)。
  2. 令 obj 为 OrdinaryObjectCreate(%Object.prototype%)。
  3. 断言:obj 是没有自有属性的可扩展普通对象。
  4. 令 closure 为具有参数 (key, value) 的新 Abstract Closure,它捕获 obj,并在被调用时执行以下步骤:
    1. 令 propertyKey 为 ? ToPropertyKey(key)。
    2. 执行 ! CreateDataPropertyOrThrow(obj, propertyKey, value)。
    3. 返回 NormalCompletion(undefined)。
  5. 令 adder 为 CreateBuiltinFunction(closure, 2, "", « »)。
  6. 返回 ? AddEntriesFromIterable(obj, iterable, adder)。
注
为 adder 创建的函数永远无法被 ECMAScript 代码直接访问。

20.1.2.8 Object.getOwnPropertyDescriptor ( obj, key )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 propertyKey 为 ? ToPropertyKey(key)。
  3. 令 propertyDesc 为 ? coerced.[[GetOwnProperty]](propertyKey)。
  4. 返回 FromPropertyDescriptor(propertyDesc)。

20.1.2.9 Object.getOwnPropertyDescriptors ( obj )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 ownKeys 为 ? coerced.[[OwnPropertyKeys]]()。
  3. 令 descs 为 OrdinaryObjectCreate(%Object.prototype%)。
  4. 对 ownKeys 的每个元素 key,执行
    1. 令 propertyDesc 为 ? coerced.[[GetOwnProperty]](key)。
    2. 令 propertyDescObj 为 FromPropertyDescriptor(propertyDesc)。
    3. 如果 propertyDescObj 不是 undefined,则执行 ! CreateDataPropertyOrThrow(descs, key, propertyDescObj)。
  5. 返回 descs。

20.1.2.10 Object.getOwnPropertyNames ( obj )

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

  1. 返回 CreateArrayFromList(? GetOwnPropertyKeys(obj, string))。

20.1.2.11 Object.getOwnPropertySymbols ( obj )

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

  1. 返回 CreateArrayFromList(? GetOwnPropertyKeys(obj, symbol))。

20.1.2.11.1 GetOwnPropertyKeys ( value, type )

抽象操作 GetOwnPropertyKeys,接收参数 value (ECMAScript 语言值) 和 type ((string 或 symbol));返回值:(正常完成 (值:列表 (元素:属性键)) 或 抛出完成)。 调用时执行以下步骤:

  1. 令 obj 为 ? ToObject(value)。
  2. 令 keys 为 ? obj.[[OwnPropertyKeys]]()。
  3. 令 nameList 为新的空 List。
  4. 对 keys 的每个元素 nextKey,执行
    1. 如果 nextKey 是 Symbol 且 type 是 symbol,或者 nextKey 是 String 且 type 是 string,则
      1. 将 nextKey 追加到 nameList。
  5. 返回 nameList。

20.1.2.12 Object.getPrototypeOf ( obj )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 返回 ? coerced.[[GetPrototypeOf]]()。

20.1.2.13 Object.groupBy ( items, callback )

注

callback 应是接受两个参数的函数。groupBy 按升序对 items 中的每个元素调用一次 callback,并构造一个新对象。callback 返回的每个值都会强制转换为属性键。对于每个这样的属性键,结果对象都具有一个属性,其键是该属性键,其值是包含所有 callback 返回值强制转换为该键的元素的数组。

调用 callback 时传递两个参数:元素的值和元素的索引。

groupBy 的返回值是不从 %Object.prototype% 继承的对象。

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

  1. 令 groups 为 ? GroupBy(items, callback, property)。
  2. 令 obj 为 OrdinaryObjectCreate(null)。
  3. 对 groups 的每个 Record { [[Key]], [[Elements]] } group,执行
    1. 令 elements 为 CreateArrayFromList(group.[[Elements]])。
    2. 执行 ! CreateDataPropertyOrThrow(obj, group.[[Key]], elements)。
  4. 返回 obj。

20.1.2.14 Object.hasOwn ( obj, key )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 propertyKey 为 ? ToPropertyKey(key)。
  3. 返回 ? HasOwnProperty(coerced, propertyKey)。

20.1.2.15 Object.is ( value1, value2 )

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

  1. 返回 SameValue(value1, value2)。

20.1.2.16 Object.isExtensible ( obj )

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

  1. 如果 obj 不是 Object,则返回 false。
  2. 返回 ? IsExtensible(obj)。

20.1.2.17 Object.isFrozen ( obj )

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

  1. 如果 obj 不是 Object,则返回 true。
  2. 返回 ? TestIntegrityLevel(obj, frozen)。

20.1.2.18 Object.isSealed ( obj )

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

  1. 如果 obj 不是 Object,则返回 true。
  2. 返回 ? TestIntegrityLevel(obj, sealed)。

20.1.2.19 Object.keys ( obj )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 keyList 为 ? EnumerableOwnProperties(coerced, key)。
  3. 返回 CreateArrayFromList(keyList)。

20.1.2.20 Object.preventExtensions ( obj )

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

  1. 如果 obj 不是 Object,则返回 obj。
  2. 令 status 为 ? obj.[[PreventExtensions]]()。
  3. 如果 status 是 false,则抛出 TypeError 异常。
  4. 返回 obj。

20.1.2.21 Object.prototype

Object.prototype 的初始值是 Object 原型对象。

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

20.1.2.22 Object.seal ( obj )

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

  1. 如果 obj 不是 Object,则返回 obj。
  2. 令 status 为 ? SetIntegrityLevel(obj, sealed)。
  3. 如果 status 是 false,则抛出 TypeError 异常。
  4. 返回 obj。

20.1.2.23 Object.setPrototypeOf ( obj, proto )

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

  1. 执行 ? RequireObjectCoercible(obj)。
  2. 如果 proto 不是 Object 且 proto 不是 null,则抛出 TypeError 异常。
  3. 如果 obj 不是 Object,则返回 obj。
  4. 令 status 为 ? obj.[[SetPrototypeOf]](proto)。
  5. 如果 status 是 false,则抛出 TypeError 异常。
  6. 返回 obj。

20.1.2.24 Object.values ( obj )

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

  1. 令 coerced 为 ? ToObject(obj)。
  2. 令 valueList 为 ? EnumerableOwnProperties(coerced, value)。
  3. 返回 CreateArrayFromList(valueList)。

20.1.3 Object 原型对象的属性

Object 原型对象:

  • 是 %Object.prototype%。
  • 具有 [[Extensible]] 内部槽,其值是 true。
  • 具有为普通对象定义的内部方法,但 [[SetPrototypeOf]] 方法除外,该方法定义于 10.4.7.1。(因此,它是不可变原型异质对象。)
  • 具有 [[Prototype]] 内部槽,其值是 null。

20.1.3.1 Object.prototype.constructor

Object.prototype.constructor 的初始值是 %Object%。

20.1.3.2 Object.prototype.hasOwnProperty ( value )

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

  1. 令 propertyKey 为 ? ToPropertyKey(value)。
  2. 令 obj 为 ? ToObject(this value)。
  3. 返回 ? HasOwnProperty(obj, propertyKey)。
注

步骤 1 和 2 的顺序是有意选择的,以确保即使 this value 是 undefined 或 null,在本规范早期版本中本应由步骤 1 抛出的任何异常仍会继续抛出。

20.1.3.3 Object.prototype.isPrototypeOf ( value )

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

  1. 如果 value 不是 Object,则返回 false。
  2. 令 obj 为 ? ToObject(this value)。
  3. 重复执行,
    1. 将 value 设置为 ? value.[[GetPrototypeOf]]()。
    2. 如果 value 是 null,则返回 false。
    3. 如果 SameValue(obj, value) 是 true,则返回 true。
注

步骤 1 和 2 的顺序保留了本规范早期版本在 value 不是对象且 this value 是 undefined 或 null 时规定的行为。

20.1.3.4 Object.prototype.propertyIsEnumerable ( value )

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

  1. 令 propertyKey 为 ? ToPropertyKey(value)。
  2. 令 obj 为 ? ToObject(this value)。
  3. 令 propertyDesc 为 ? obj.[[GetOwnProperty]](propertyKey)。
  4. 如果 propertyDesc 是 undefined,则返回 false。
  5. 返回 propertyDesc.[[Enumerable]]。
注 1

此方法不考虑原型链中的对象。

注 2

步骤 1 和 2 的顺序是有意选择的,以确保即使 this value 是 undefined 或 null,在本规范早期版本中本应由步骤 1 抛出的任何异常仍会继续抛出。

20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

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

  1. 令 thisValue 为 this value。
  2. 返回 ? Invoke(thisValue, "toString")。

此方法的可选参数不会被使用,但旨在对应 ECMA-402 toLocaleString 方法使用的参数模式。不包含 ECMA-402 支持的实现不得将这些参数位置用于其他目的。

注 1

此方法为没有区域设置敏感 toString 行为的对象提供通用的 toLocaleString 实现。Array、Number、Date 和 %TypedArray% 提供各自的区域设置敏感 toLocaleString 方法。

注 2

ECMA-402 有意不为此默认实现提供替代方案。

20.1.3.6 Object.prototype.toString ( )

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

  1. 如果 this value 是 undefined,则返回 "[object Undefined]"。
  2. 如果 this value 是 null,则返回 "[object Null]"。
  3. 令 obj 为 ! ToObject(this value)。
  4. 令 isArray 为 ? IsArray(obj)。
  5. 如果 isArray 是 true,则令 builtinTag 为 "Array"。
  6. 否则如果 obj 具有 [[ParameterMap]] 内部槽,则令 builtinTag 为 "Arguments"。
  7. 否则如果 obj 具有 [[Call]] 内部方法,则令 builtinTag 为 "Function"。
  8. 否则如果 obj 具有 [[ErrorData]] 内部槽,则令 builtinTag 为 "Error"。
  9. 否则如果 obj 具有 [[BooleanData]] 内部槽,则令 builtinTag 为 "Boolean"。
  10. 否则如果 obj 具有 [[NumberData]] 内部槽,则令 builtinTag 为 "Number"。
  11. 否则如果 obj 具有 [[StringData]] 内部槽,则令 builtinTag 为 "String"。
  12. 否则如果 obj 具有 [[DateValue]] 内部槽,则令 builtinTag 为 "Date"。
  13. 否则如果 obj 具有 [[RegExpMatcher]] 内部槽,则令 builtinTag 为 "RegExp"。
  14. 否则,令 builtinTag 为 "Object"。
  15. 令 tag 为 ? Get(obj, %Symbol.toStringTag%)。
  16. 如果 tag 不是 String,则将 tag 设置为 builtinTag。
  17. 返回 "[object "、tag 和 "]" 的字符串连接。
注

从历史上看,此方法偶尔用于访问 [[Class]] 内部槽的 String 值,该内部槽在本规范早期版本中用作各种内置对象的名义类型标签。上述 toString 定义为使用 toString 测试这些特定内置对象种类的旧代码保留了兼容性。对于其他种类的内置对象或程序定义对象,它并不能提供可靠的类型测试机制。此外,程序可以以某些方式使用 %Symbol.toStringTag%,从而使此类旧式类型测试失去可靠性。

20.1.3.7 Object.prototype.valueOf ( )

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

  1. 返回 ? ToObject(this value)。

20.1.3.8 Object.prototype.__proto__

Object.prototype.__proto__ 是访问器属性,具有特性 { [[Enumerable]]: false, [[Configurable]]: true }。[[Getter]] 和 [[Setter]] 特性定义如下:

20.1.3.8.1 get Object.prototype.__proto__

[[Getter]] 特性的值是一个不需要参数的内置函数。调用时,它执行以下步骤:

  1. 令 obj 为 ? ToObject(this value)。
  2. 返回 ? obj.[[GetPrototypeOf]]()。

20.1.3.8.2 set Object.prototype.__proto__

[[Setter]] 特性的值是接受参数 proto 的内置函数。调用时,它执行以下步骤:

  1. 令 thisValue 为 this value。
  2. 执行 ? RequireObjectCoercible(thisValue)。
  3. 如果 proto 不是 Object 且 proto 不是 null,则返回 undefined。
  4. 如果 thisValue 不是 Object,则返回 undefined。
  5. 令 status 为 ? thisValue.[[SetPrototypeOf]](proto)。
  6. 如果 status 是 false,则抛出 TypeError 异常。
  7. 返回 undefined。

20.1.3.9 旧式 Object.prototype 访问器方法

20.1.3.9.1 Object.prototype.__defineGetter__ ( key, getter )

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

  1. 令 obj 为 ? ToObject(this value)。
  2. 如果 IsCallable(getter) 是 false,则抛出 TypeError 异常。
  3. 令 propertyDesc 为 PropertyDescriptor { [[Getter]]: getter, [[Enumerable]]: true, [[Configurable]]: true }。
  4. 令 propertyKey 为 ? ToPropertyKey(key)。
  5. 执行 ? DefinePropertyOrThrow(obj, propertyKey, propertyDesc)。
  6. 返回 undefined。

20.1.3.9.2 Object.prototype.__defineSetter__ ( key, setter )

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

  1. 令 obj 为 ? ToObject(this value)。
  2. 如果 IsCallable(setter) 是 false,则抛出 TypeError 异常。
  3. 令 propertyDesc 为 PropertyDescriptor { [[Setter]]: setter, [[Enumerable]]: true, [[Configurable]]: true }。
  4. 令 propertyKey 为 ? ToPropertyKey(key)。
  5. 执行 ? DefinePropertyOrThrow(obj, propertyKey, propertyDesc)。
  6. 返回 undefined。

20.1.3.9.3 Object.prototype.__lookupGetter__ ( key )

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

  1. 令 obj 为 ? ToObject(this value)。
  2. 令 propertyKey 为 ? ToPropertyKey(key)。
  3. 重复执行,
    1. 令 propertyDesc 为 ? obj.[[GetOwnProperty]](propertyKey)。
    2. 如果 propertyDesc 不是 undefined,则
      1. 如果 IsAccessorDescriptor(propertyDesc) 是 true,则返回 propertyDesc.[[Getter]]。
      2. 返回 undefined。
    3. 将 obj 设置为 ? obj.[[GetPrototypeOf]]()。
    4. 如果 obj 是 null,则返回 undefined。

20.1.3.9.4 Object.prototype.__lookupSetter__ ( key )

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

  1. 令 obj 为 ? ToObject(this value)。
  2. 令 propertyKey 为 ? ToPropertyKey(key)。
  3. 重复执行,
    1. 令 propertyDesc 为 ? obj.[[GetOwnProperty]](propertyKey)。
    2. 如果 propertyDesc 不是 undefined,则
      1. 如果 IsAccessorDescriptor(propertyDesc) 是 true,则返回 propertyDesc.[[Setter]]。
      2. 返回 undefined。
    3. 将 obj 设置为 ? obj.[[GetPrototypeOf]]()。
    4. 如果 obj 是 null,则返回 undefined。

20.1.4 Object 实例的属性

Object 实例除了从 Object 原型对象继承的属性外,没有特殊属性。

20.2 Function 对象

20.2.1 Function 构造函数

Function 构造函数:

  • 是 %Function%。
  • 是全局对象的 "Function" 属性的初始值。
  • 作为函数而不是构造函数调用时,会创建并初始化新的函数对象。因此,函数调用 Function(…) 等价于使用相同参数的对象创建表达式 new Function(…)。
  • 可以用作类定义的 extends 子句的值。希望继承指定 Function 行为的子类构造函数,必须包含对 Function 构造函数的 super 调用,以创建并初始化具有内置函数行为所需内部槽的子类实例。所有用于定义函数对象的 ECMAScript 句法形式都会创建 Function 的实例。除内置的 GeneratorFunction、AsyncFunction 和 AsyncGeneratorFunction 子类之外,没有句法方式可以创建 Function 子类的实例。

20.2.1.1 Function ( ...paramArgs, bodyArg )

最后一个参数(如果存在)指定函数的主体(可执行代码);此前的任何参数指定形式参数。

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

  1. 令 ctor 为活动函数对象。
  2. 如果不存在 bodyArg,则将 bodyArg 设置为空 String。
  3. 返回 ? CreateDynamicFunction(ctor, NewTarget, normal, paramArgs, bodyArg)。
注

允许但不要求为每个要指定的形式参数分别提供一个参数。例如,以下三个表达式都产生相同结果:

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

20.2.1.1.1 CreateDynamicFunction ( ctor, newTarget, kind, paramArgs, bodyArg )

抽象操作 CreateDynamicFunction,接收参数 ctor (构造函数)、newTarget ((构造函数 或 undefined))、kind ((normal、generator、async 或 async-generator))、paramArgs (列表 (元素:ECMAScript 语言值)) 和 bodyArg (ECMAScript 语言值);返回值:(正常完成 (值:ECMAScript 函数对象) 或 抛出完成)。 ctor 是执行此操作的构造函数。newTarget 是最初对其应用 new 的构造函数。paramArgs 和 bodyArg 反映传递给 ctor 的参数值。 调用时执行以下步骤:

  1. 如果 newTarget 是 undefined,则将 newTarget 设置为 ctor。
  2. 如果 kind 是 normal,则
    1. 令 prefix 为 "function"。
    2. 令 exprGrammar 为文法符号 FunctionExpression。
    3. 令 bodyGrammar 为文法符号 FunctionBody[~Yield, ~Await]。
    4. 令 paramGrammar 为文法符号 FormalParameters[~Yield, ~Await]。
    5. 令 fallbackProto 为 "%Function.prototype%"。
  3. 否则如果 kind 是 generator,则
    1. 令 prefix 为 "function*"。
    2. 令 exprGrammar 为文法符号 GeneratorExpression。
    3. 令 bodyGrammar 为文法符号 GeneratorBody。
    4. 令 paramGrammar 为文法符号 FormalParameters[+Yield, ~Await]。
    5. 令 fallbackProto 为 "%GeneratorFunction.prototype%"。
  4. 否则如果 kind 是 async,则
    1. 令 prefix 为 "async function"。
    2. 令 exprGrammar 为文法符号 AsyncFunctionExpression。
    3. 令 bodyGrammar 为文法符号 AsyncFunctionBody。
    4. 令 paramGrammar 为文法符号 FormalParameters[~Yield, +Await]。
    5. 令 fallbackProto 为 "%AsyncFunction.prototype%"。
  5. 否则,
    1. 断言:kind 是 async-generator。
    2. 令 prefix 为 "async function*"。
    3. 令 exprGrammar 为文法符号 AsyncGeneratorExpression。
    4. 令 bodyGrammar 为文法符号 AsyncGeneratorBody。
    5. 令 paramGrammar 为文法符号 FormalParameters[+Yield, +Await]。
    6. 令 fallbackProto 为 "%AsyncGeneratorFunction.prototype%"。
  6. 令 argCount 为 paramArgs 中的元素数量。
  7. 令 paramStrings 为新的空 List。
  8. 对 paramArgs 的每个元素 arg,执行
    1. 将 ? ToString(arg) 追加到 paramStrings。
  9. 令 bodyString 为 ? ToString(bodyArg)。
  10. 令 currentRealm 为当前 Realm Record。
  11. 执行 ? HostEnsureCanCompileStrings(currentRealm, paramStrings, bodyString, false)。
  12. 令 paramString 为空 String。
  13. 如果 argCount > 0,则
    1. 将 paramString 设置为 paramStrings[0]。
    2. 令 k 为 1。
    3. 当 k < argCount 时,重复执行,
      1. 令 nextArgString 为 paramStrings[k]。
      2. 将 paramString 设置为 paramString、","(逗号)和 nextArgString 的字符串连接。
      3. 将 k 设置为 k + 1。
  14. 令 bodyParseString 为 0x000A (LINE FEED)、bodyString 和 0x000A (LINE FEED) 的字符串连接。
  15. 令 sourceString 为 prefix、" anonymous("、paramString、0x000A (LINE FEED)、") {"、bodyParseString 和 "}" 的字符串连接。
  16. 令 sourceText 为 StringToCodePoints(sourceString)。
  17. 令 params 为 ParseText(paramString, paramGrammar)。
  18. 如果 params 是错误的 List,则抛出 SyntaxError 异常。
  19. 令 body 为 ParseText(bodyParseString, bodyGrammar)。
  20. 如果 body 是错误的 List,则抛出 SyntaxError 异常。
  21. 注:参数和函数体会分别解析,以确保它们各自单独有效。例如,new Function("/*", "*/ ) {") 不会求值为函数。
  22. 注:如果执行到此步骤,sourceText 必须具有 exprGrammar 的语法(尽管反向推论不成立)。接下来的两个步骤用于强制执行直接适用于 exprGrammar 的任何提前错误规则。
  23. 令 expr 为 ParseText(sourceText, exprGrammar)。
  24. 如果 expr 是错误的 List,则抛出 SyntaxError 异常。
  25. 令 funcProto 为 ? GetPrototypeFromConstructor(newTarget, fallbackProto)。
  26. 令 envRecord 为 currentRealm.[[GlobalEnv]]。
  27. 令 privateEnv 为 null。
  28. 令 func 为 OrdinaryFunctionCreate(funcProto, sourceText, params, body, non-lexical-this, envRecord, privateEnv)。
  29. 执行 SetFunctionName(func, "anonymous")。
  30. 如果 kind 是 generator,则
    1. 令 protoProto 为 OrdinaryObjectCreate(%GeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: protoProto, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  31. 否则如果 kind 是 async-generator,则
    1. 令 protoProto 为 OrdinaryObjectCreate(%AsyncGeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: protoProto, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  32. 否则如果 kind 是 normal,则
    1. 执行 MakeConstructor(func)。
  33. 注:kind 为 async 的函数不可构造,并且没有 [[Construct]] 内部方法或 "prototype" 属性。
  34. 返回 func。
注

CreateDynamicFunction 会在其创建的、kind 不是 async 的任何函数上定义 "prototype" 属性,以便支持该函数可能被用作构造函数。

20.2.2 Function 构造函数的属性

Function 构造函数:

  • 自身是内置函数对象。
  • 具有 [[Prototype]] 内部槽,其值是 %Function.prototype%。
  • 具有 "length" 属性,其值是 1𝔽。
  • 具有以下属性:

20.2.2.1 Function.prototype

Function.prototype 的值是 Function 原型对象。

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

20.2.3 Function 原型对象的属性

Function 原型对象:

  • 是 %Function.prototype%。
  • 自身是内置函数对象。
  • 调用时接受任意参数并返回 undefined。
  • 没有 [[Construct]] 内部方法;不能通过 new 运算符将其用作构造函数。
  • 具有 [[Prototype]] 内部槽,其值是 %Object.prototype%。
  • 没有 "prototype" 属性。
  • 具有 "length" 属性,其值是 +0𝔽。
  • 具有 "name" 属性,其值是空 String。
注

Function 原型对象被规定为函数对象,以确保与 ECMAScript 2015 规范之前创建的 ECMAScript 代码保持兼容。

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

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

  1. 令 func 为 this value。
  2. 如果 IsCallable(func) 是 false,则抛出 TypeError 异常。
  3. 如果 argArray 是 undefined 或 null,则
    1. 执行 PrepareForTailCall()。
    2. 返回 ? Call(func, thisArg)。
  4. 令 argList 为 ? CreateListFromArrayLike(argArray)。
  5. 执行 PrepareForTailCall()。
  6. 返回 ? Call(func, thisArg, argList)。
注 1

thisArg 值未经修改直接作为 this value 传递。这与第 3 版不同,在第 3 版中,undefined 或 null 的 thisArg 会被替换为全局对象,并对所有其他值应用 ToObject,然后将该结果作为 this value 传递。尽管 thisArg 未经修改传递,非严格函数在进入函数时仍会执行这些转换。

注 2

如果 func 是箭头函数或绑定函数异质对象,则函数 [[Call]] 会在步骤 6 中忽略 thisArg。

20.2.3.2 Function.prototype.bind ( thisArg, ...args )

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

  1. 令 target 为 this value。
  2. 如果 IsCallable(target) 是 false,则抛出 TypeError 异常。
  3. 令 boundFunc 为 ? BoundFunctionCreate(target, thisArg, args)。
  4. 令 length 为 0。
  5. 令 targetHasLength 为 ? HasOwnProperty(target, "length")。
  6. 如果 targetHasLength 是 true,则
    1. 令 targetLength 为 ? Get(target, "length")。
    2. 如果 targetLength 是 Number,则
      1. 令 targetLengthAsInt 为 ! ToIntegerOrInfinity(targetLength)。
      2. 如果 targetLengthAsInt = +∞,则
        1. 将 length 设置为 +∞。
      3. 否则如果 targetLengthAsInt = -∞,则
        1. 将 length 设置为 0。
      4. 否则,
        1. 令 argCount 为 args 中的元素数量。
        2. 将 length 设置为 max(targetLengthAsInt - argCount, 0)。
  7. 执行 SetFunctionLength(boundFunc, length)。
  8. 令 targetName 为 ? Get(target, "name")。
  9. 如果 targetName 不是 String,则将 targetName 设置为空 String。
  10. 执行 SetFunctionName(boundFunc, targetName, "bound")。
  11. 返回 boundFunc。
注 1

使用 Function.prototype.bind 创建的函数对象是异质对象。它们也没有 "prototype" 属性。

注 2

如果 target 是箭头函数或绑定函数异质对象,则传递给此方法的 thisArg 不会被随后对 func 的调用使用。

20.2.3.3 Function.prototype.call ( thisArg, ...args )

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

  1. 令 func 为 this value。
  2. 如果 IsCallable(func) 是 false,则抛出 TypeError 异常。
  3. 执行 PrepareForTailCall()。
  4. 返回 ? Call(func, thisArg, args)。
注 1

thisArg 值未经修改直接作为 this value 传递。这与第 3 版不同,在第 3 版中,undefined 或 null 的 thisArg 会被替换为全局对象,并对所有其他值应用 ToObject,然后将该结果作为 this value 传递。尽管 thisArg 未经修改传递,非严格函数在进入函数时仍会执行这些转换。

注 2

如果 func 是箭头函数或绑定函数异质对象,则函数 [[Call]] 会在步骤 4 中忽略 thisArg。

20.2.3.4 Function.prototype.constructor

Function.prototype.constructor 的初始值是 %Function%。

20.2.3.5 Function.prototype.toString ( )

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

  1. 令 func 为 this value。
  2. 如果 func 是 Object,func 具有 [[SourceText]] 内部槽,func.[[SourceText]] 是 Unicode 码点序列,并且 HostHasSourceTextAvailable(func) 是 true,则
    1. 返回 CodePointsToString(func.[[SourceText]])。
  3. 如果 func 是内置函数对象,则返回 func 的实现定义 String 源代码表示。该表示必须具有 NativeFunction 的语法。此外,如果 func 具有 [[InitialName]] 内部槽并且 func.[[InitialName]] 是 String,则返回 String 中由 NativeFunctionAccessoropt PropertyName 匹配的部分必须是 func.[[InitialName]]。
  4. 如果 func 是 Object 且 IsCallable(func) 是 true,则返回 func 的实现定义 String 源代码表示。该表示必须具有 NativeFunction 的语法。
  5. 抛出 TypeError 异常。
NativeFunction : function NativeFunctionAccessoropt PropertyName[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] } NativeFunctionAccessor : get set

20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( value )

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

  1. 令 thisValue 为 this value。
  2. 返回 ? OrdinaryHasInstance(thisValue, value)。

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

注

这是大多数函数继承的 %Symbol.hasInstance% 默认实现。instanceof 运算符会调用 %Symbol.hasInstance% 来确定某个值是否为特定构造函数的实例。例如表达式

v instanceof F

求值方式等同于

F[%Symbol.hasInstance%](v)

构造函数可以通过在函数上暴露不同的 %Symbol.hasInstance% 方法,控制 instanceof 将哪些对象识别为其实例。

此属性不可写且不可配置,以防止可能用于全局暴露绑定函数目标函数的篡改。

此方法的 "name" 属性值是 "[Symbol.hasInstance]"。

20.2.4 Function 实例

每个 Function 实例都是 ECMAScript 函数对象,并具有 表 26 中列出的内部槽。使用 Function.prototype.bind 方法(20.2.3.2)创建的 Function 对象具有 表 27 中列出的内部槽。

Function 实例具有以下属性:

20.2.4.1 length

"length" 属性的值是整数 Number,表示函数通常期望的参数数量。不过,该语言允许使用其他数量的参数调用函数。当使用与其 "length" 属性所指定数量不同的参数数量调用函数时,其行为取决于该函数。此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

20.2.4.2 name

"name" 属性的值是描述函数的 String。该名称没有语义意义,但通常是在 ECMAScript 源文本中函数定义位置用于引用该函数的变量名或属性名。此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

本规范未为其关联上下文名称的匿名函数对象使用空 String 作为 "name" 属性的值。

20.2.4.3 prototype

可用作构造函数的 Function 实例具有 "prototype" 属性。每当创建此类 Function 实例时,还会创建另一个普通对象,并将其作为该函数 "prototype" 属性的初始值。除非另有规定,当该函数作为构造函数调用时,"prototype" 属性的值用于初始化所创建对象的 [[Prototype]] 内部槽。

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

注

使用 Function.prototype.bind 创建的函数对象,或通过求值 MethodDefinition(不是 GeneratorMethod 或 AsyncGeneratorMethod)或 ArrowFunction 创建的函数对象,都没有 "prototype" 属性。

20.2.5 HostHasSourceTextAvailable ( func )

宿主定义的抽象操作 HostHasSourceTextAvailable,接收参数 func (函数对象);返回值:Boolean。 它允许宿主环境阻止为 func 提供源文本。

HostHasSourceTextAvailable 的实现必须符合以下要求:

  • 相对于其参数,它必须是确定性的。每次以特定 func 作为参数调用时,都必须返回相同结果。

HostHasSourceTextAvailable 的默认实现是返回 true。

20.3 Boolean 对象

20.3.1 Boolean 构造函数

Boolean 构造函数:

  • 是 %Boolean%。
  • 是全局对象的 "Boolean" 属性的初始值。
  • 作为构造函数调用时,创建并初始化新的 Boolean 对象。
  • 作为函数而不是构造函数调用时执行类型转换。
  • 可以用作类定义的 extends 子句的值。希望继承指定 Boolean 行为的子类构造函数必须包含对 Boolean 构造函数的 super 调用,以创建并初始化具有 [[BooleanData]] 内部槽的子类实例。

20.3.1.1 Boolean ( value )

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

  1. 令 bool 为 ToBoolean(value)。
  2. 如果 NewTarget 是 undefined,则返回 bool。
  3. 令 obj 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)。
  4. 将 obj.[[BooleanData]] 设置为 bool。
  5. 返回 obj。

20.3.2 Boolean 构造函数的属性

Boolean 构造函数:

20.3.2.1 Boolean.prototype

Boolean.prototype 的初始值是 Boolean 原型对象。

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

20.3.3 Boolean 原型对象的属性

Boolean 原型对象:

  • 是 %Boolean.prototype%。
  • 是普通对象。
  • 自身是 Boolean 对象;它具有 [[BooleanData]] 内部槽,其值是 false。
  • 具有 [[Prototype]] 内部槽,其值是 %Object.prototype%。

20.3.3.1 Boolean.prototype.constructor

Boolean.prototype.constructor 的初始值是 %Boolean%。

20.3.3.2 Boolean.prototype.toString ( )

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

  1. 令 bool 为 ? ThisBooleanValue(this value)。
  2. 如果 bool 是 true,则返回 "true"。
  3. 返回 "false"。

20.3.3.3 Boolean.prototype.valueOf ( )

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

  1. 返回 ? ThisBooleanValue(this value)。

20.3.3.3.1 ThisBooleanValue ( arg )

抽象操作 ThisBooleanValue,接收参数 arg (ECMAScript 语言值);返回值:(正常完成 (值:Boolean) 或 抛出完成)。 调用时执行以下步骤:

  1. 如果 arg 是 Boolean,则返回 arg。
  2. 如果 arg 是 Object 且 arg 具有 [[BooleanData]] 内部槽,则
    1. 令 bool 为 arg.[[BooleanData]]。
    2. 断言:bool 是 Boolean。
    3. 返回 bool。
  3. 抛出 TypeError 异常。

20.3.4 Boolean 实例的属性

Boolean 实例是从 Boolean 原型对象继承属性的普通对象。Boolean 实例具有 [[BooleanData]] 内部槽。[[BooleanData]] 内部槽是此 Boolean 对象表示的 Boolean 值。

20.4 Symbol 对象

20.4.1 Symbol 构造函数

Symbol 构造函数:

  • 是 %Symbol%。
  • 是全局对象的 "Symbol" 属性的初始值。
  • 作为函数调用时返回新的 Symbol 值。
  • 不旨在与 new 运算符一起使用。
  • 不旨在被子类化。
  • 可以用作类定义的 extends 子句的值,但对它进行 super 调用会导致异常。

20.4.1.1 Symbol ( [ description ] )

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

  1. 如果 NewTarget 不是 undefined,则抛出 TypeError 异常。
  2. 如果 description 是 undefined,则令 descString 为 undefined。
  3. 否则,令 descString 为 ? ToString(description)。
  4. 返回一个新的 Symbol,其 [[Description]] 为 descString。

20.4.2 Symbol 构造函数的属性

Symbol 构造函数:

20.4.2.1 Symbol.asyncDispose

Symbol.asyncDispose 的初始值是众所周知的 symbol %Symbol.asyncDispose%(表 1)。

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

20.4.2.2 Symbol.asyncIterator

Symbol.asyncIterator 的初始值是众所周知的 symbol %Symbol.asyncIterator%(表 1)。

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

20.4.2.3 Symbol.dispose

Symbol.dispose 的初始值是众所周知的 symbol %Symbol.dispose%(表 1)。

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

20.4.2.4 Symbol.for ( key )

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

  1. 令 stringKey 为 ? ToString(key)。
  2. 令 agentRecord 为周围代理的 Agent Record。
  3. 令 globalSymbolRegistry 为 agentRecord.[[GlobalSymbolRegistry]]。
  4. 对 globalSymbolRegistry 的每个元素 element,执行
    1. 如果 element.[[Key]] 是 stringKey,则返回 element.[[Symbol]]。
  5. 断言:globalSymbolRegistry 当前不包含 stringKey 的条目。
  6. 令 newSymbol 为一个新的 Symbol,其 [[Description]] 为 stringKey。
  7. 将 GlobalSymbolRegistry Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } 追加到 globalSymbolRegistry。
  8. 返回 newSymbol。

20.4.2.5 Symbol.hasInstance

Symbol.hasInstance 的初始值是众所周知的 symbol %Symbol.hasInstance%(表 1)。

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

20.4.2.6 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 的初始值是众所周知的 symbol %Symbol.isConcatSpreadable%(表 1)。

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

20.4.2.7 Symbol.iterator

Symbol.iterator 的初始值是众所周知的 symbol %Symbol.iterator%(表 1)。

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

20.4.2.8 Symbol.keyFor ( symbol )

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

  1. 如果 symbol 不是 Symbol,则抛出 TypeError 异常。
  2. 返回 KeyForSymbol(symbol)。

20.4.2.9 Symbol.match

Symbol.match 的初始值是众所周知的 symbol %Symbol.match%(表 1)。

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

20.4.2.10 Symbol.matchAll

Symbol.matchAll 的初始值是众所周知的 symbol %Symbol.matchAll%(表 1)。

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

20.4.2.11 Symbol.prototype

Symbol.prototype 的初始值是 Symbol 原型对象。

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

20.4.2.12 Symbol.replace

Symbol.replace 的初始值是众所周知的 symbol %Symbol.replace%(表 1)。

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

20.4.2.13 Symbol.search

Symbol.search 的初始值是众所周知的 symbol %Symbol.search%(表 1)。

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

20.4.2.14 Symbol.species

Symbol.species 的初始值是众所周知的 symbol %Symbol.species%(表 1)。

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

20.4.2.15 Symbol.split

Symbol.split 的初始值是众所周知的 symbol %Symbol.split%(表 1)。

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

20.4.2.16 Symbol.toPrimitive

Symbol.toPrimitive 的初始值是众所周知的 symbol %Symbol.toPrimitive%(表 1)。

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

20.4.2.17 Symbol.toStringTag

Symbol.toStringTag 的初始值是众所周知的 symbol %Symbol.toStringTag%(表 1)。

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

20.4.2.18 Symbol.unscopables

Symbol.unscopables 的初始值是众所周知的 symbol %Symbol.unscopables%(表 1)。

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

20.4.3 Symbol 原型对象的属性

Symbol 原型对象:

  • 是 %Symbol.prototype%。
  • 是普通对象。
  • 不是 Symbol 实例,并且没有 [[SymbolData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值是 %Object.prototype%。

20.4.3.1 Symbol.prototype.constructor

Symbol.prototype.constructor 的初始值是 %Symbol%。

20.4.3.2 get Symbol.prototype.description

Symbol.prototype.description 是访问器属性,其 set 访问器函数为 undefined。其 get 访问器函数在调用时执行以下步骤:

  1. 令 symbol 为 ? ThisSymbolValue(this value)。
  2. 返回 symbol.[[Description]]。

20.4.3.3 Symbol.prototype.toString ( )

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

  1. 令 symbol 为 ? ThisSymbolValue(this value)。
  2. 返回 SymbolDescriptiveString(symbol)。

20.4.3.3.1 SymbolDescriptiveString ( symbol )

抽象操作 SymbolDescriptiveString,接收参数 symbol (Symbol);返回值:String。 调用时执行以下步骤:

  1. 令 description 为 symbol.[[Description]]。
  2. 如果 description 是 undefined,则将 description 设置为空 String。
  3. 断言:description 是 String。
  4. 返回 "Symbol("、description 和 ")" 的字符串连接。

20.4.3.4 Symbol.prototype.valueOf ( )

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

  1. 返回 ? ThisSymbolValue(this value)。

20.4.3.4.1 ThisSymbolValue ( arg )

抽象操作 ThisSymbolValue,接收参数 arg (ECMAScript 语言值);返回值:(正常完成 (值:Symbol) 或 抛出完成)。 调用时执行以下步骤:

  1. 如果 arg 是 Symbol,则返回 arg。
  2. 如果 arg 是 Object 且 arg 具有 [[SymbolData]] 内部槽,则
    1. 令 symbol 为 arg.[[SymbolData]]。
    2. 断言:symbol 是 Symbol。
    3. 返回 symbol。
  3. 抛出 TypeError 异常。

20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )

ECMAScript 语言运算符会调用此方法,将 Symbol 对象转换为原始值。

调用时,它执行以下步骤:

  1. 返回 ? ThisSymbolValue(this value)。
注

该参数会被忽略。

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

此方法的 "name" 属性值是 "[Symbol.toPrimitive]"。

20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "Symbol"。

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

20.4.4 Symbol 实例的属性

Symbol 实例是从 Symbol 原型对象继承属性的普通对象。Symbol 实例具有 [[SymbolData]] 内部槽。[[SymbolData]] 内部槽是此 Symbol 对象表示的 Symbol 值。

20.4.5 Symbol 的抽象操作

20.4.5.1 GlobalSymbolRegistry Records

GlobalSymbolRegistry Record 是用于将 String 键与通过 Symbol.for 注册的 Symbol 值关联起来的 Record。

GlobalSymbolRegistry Record 具有 表 59 中列出的字段。

表 59: GlobalSymbolRegistry Record 字段
字段名称 值 用途
[[Key]] a String 用于全局标识 Symbol 的字符串键。
[[Symbol]] a Symbol 可以从任意 realm 获取的 symbol。

20.4.5.2 KeyForSymbol ( symbol )

抽象操作 KeyForSymbol,接收参数 symbol (Symbol);返回值:(String 或 undefined)。 如果 symbol 位于周围代理的 [[GlobalSymbolRegistry]] List 中,则返回用于注册 symbol 的 String。 调用时执行以下步骤:

  1. 令 agentRecord 为周围代理的 Agent Record。
  2. 令 globalSymbolRegistry 为 agentRecord.[[GlobalSymbolRegistry]]。
  3. 对 globalSymbolRegistry 的每个元素 element,执行
    1. 如果 SameValue(element.[[Symbol]], symbol) 是 true,则返回 element.[[Key]]。
  4. 断言:globalSymbolRegistry 当前不包含 symbol 的条目。
  5. 返回 undefined。

20.5 Error 对象

发生运行时错误时,会将 Error 对象的实例作为异常抛出。Error 对象也可以作为用户定义异常类的基对象。

当 ECMAScript 实现检测到运行时错误时,它会抛出 20.5.5 中定义的某个 NativeError 对象的新实例,或者 20.5.7 中定义的 AggregateError 对象或 20.5.8 中定义的 SuppressedError 对象的新实例。这些对象都具有下述结构,区别仅在于用作构造函数名称而不是 NativeError 的名称、原型对象的 "name" 属性、原型对象的实现定义 "message" 属性,以及是否存在 %AggregateError% 特有的 "errors" 属性或 %SuppressedError% 特有的 "error" 和 "suppressed" 属性。

20.5.1 Error 构造函数

Error 构造函数:

  • 是 %Error%。
  • 是全局对象的 "Error" 属性的初始值。
  • 作为函数而不是构造函数调用时,创建并初始化新的 Error 对象。因此,函数调用 Error(…) 等价于使用相同参数的对象创建表达式 new Error(…)。
  • 可以用作类定义的 extends 子句的值。希望继承指定 Error 行为的子类构造函数必须包含对 Error 构造函数的 super 调用,以创建并初始化具有 [[ErrorData]] 内部槽的子类实例。

20.5.1.1 Error ( message [ , options ] )

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

  1. 如果 NewTarget 是 undefined,则令 newTarget 为活动函数对象;否则令 newTarget 为 NewTarget。
  2. 令 obj 为 ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. 令 messageString 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", messageString)。
  4. 执行 ? InstallErrorCause(obj, options)。
  5. 返回 obj。

20.5.2 Error 构造函数的属性

Error 构造函数:

20.5.2.1 Error.isError ( arg )

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

  1. 如果 arg 不是 Object,则返回 false。
  2. 如果 arg 没有 [[ErrorData]] 内部槽,则返回 false。
  3. 返回 true。

20.5.2.2 Error.prototype

Error.prototype 的初始值是 Error 原型对象。

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

20.5.3 Error 原型对象的属性

Error 原型对象:

  • 是 %Error.prototype%。
  • 是普通对象。
  • 不是 Error 实例,并且没有 [[ErrorData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值是 %Object.prototype%。

20.5.3.1 Error.prototype.constructor

Error.prototype.constructor 的初始值是 %Error%。

20.5.3.2 Error.prototype.message

Error.prototype.message 的初始值是空 String。

20.5.3.3 Error.prototype.name

Error.prototype.name 的初始值是 "Error"。

20.5.3.4 Error.prototype.toString ( )

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

  1. 令 obj 为 this value。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. 令 name 为 ? Get(obj, "name")。
  4. 如果 name 是 undefined,则将 name 设置为 "Error";否则将 name 设置为 ? ToString(name)。
  5. 令 message 为 ? Get(obj, "message")。
  6. 如果 message 是 undefined,则将 message 设置为空 String;否则将 message 设置为 ? ToString(message)。
  7. 如果 name 是空 String,则返回 message。
  8. 如果 message 是空 String,则返回 name。
  9. 返回 name、码元 0x003A (COLON)、码元 0x0020 (SPACE) 和 message 的字符串连接。

20.5.4 Error 实例的属性

Error 实例是从 Error 原型对象继承属性并具有 [[ErrorData]] 内部槽的普通对象,该内部槽的值是 undefined。[[ErrorData]] 唯一规定的用途是在 Object.prototype.toString 和 Error.isError 中将 Error、AggregateError、SuppressedError 和 NativeError 实例识别为 Error 对象。

20.5.5 本标准中使用的原生错误类型

检测到运行时错误时,会抛出下列某个 NativeError 对象的新实例,或 AggregateError 对象或 SuppressedError 对象的新实例。所有 NativeError 对象共享相同结构,如 20.5.6 中所述。

20.5.5.1 EvalError

EvalError 构造函数是 %EvalError%。

本规范目前未使用此异常。保留此对象是为了与本规范早期版本保持兼容。

20.5.5.2 RangeError

RangeError 构造函数是 %RangeError%。

表示某个值不在允许值的集合或范围内。

20.5.5.3 ReferenceError

ReferenceError 构造函数是 %ReferenceError%。

表示检测到了无效引用。

20.5.5.4 SyntaxError

SyntaxError 构造函数是 %SyntaxError%。

表示发生了解析错误。

20.5.5.5 TypeError

TypeError 构造函数是 %TypeError%。

当其他 NativeError 对象都不能恰当地表示失败原因时,TypeError 用于表示操作未成功。

20.5.5.6 URIError

URIError 构造函数是 %URIError%。

表示某个全局 URI 处理函数以与其定义不兼容的方式使用。

20.5.6 NativeError 对象结构

这些对象都具有下述结构,区别仅在于用作构造函数名称的名称以及原型对象的 "name" 属性。

对于每个错误对象,定义中对 NativeError 的引用都应替换为 20.5.5 中相应的错误对象名称。

20.5.6.1 NativeError 构造函数

每个 NativeError 构造函数:

  • 作为函数而不是构造函数调用时,创建并初始化新的 NativeError 对象。将该对象作为函数调用,等价于使用相同参数将其作为构造函数调用。因此,函数调用 NativeError(…) 等价于使用相同参数的对象创建表达式 new NativeError(…)。
  • 可以用作类定义的 extends 子句的值。希望继承指定 NativeError 行为的子类构造函数必须包含对 NativeError 构造函数的 super 调用,以创建并初始化具有 [[ErrorData]] 内部槽的子类实例。

20.5.6.1.1 NativeError ( message [ , options ] )

调用时,每个 NativeError 函数执行以下步骤:

  1. 如果 NewTarget 是 undefined,则令 newTarget 为活动函数对象;否则令 newTarget 为 NewTarget。
  2. 令 obj 为 ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. 令 messageString 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", messageString)。
  4. 执行 ? InstallErrorCause(obj, options)。
  5. 返回 obj。

步骤 2 中传递的字符串实际值是 "%EvalError.prototype%"、"%RangeError.prototype%"、"%ReferenceError.prototype%"、"%SyntaxError.prototype%"、"%TypeError.prototype%" 或 "%URIError.prototype%" 之一,具体取决于正在定义哪个 NativeError 构造函数。

20.5.6.2 NativeError 构造函数的属性

每个 NativeError 构造函数:

  • 具有 [[Prototype]] 内部槽,其值是 %Error%。
  • 具有 "name" 属性,其值是 String 值 "NativeError"。
  • 具有以下属性:

20.5.6.2.1 NativeError.prototype

NativeError.prototype 的初始值是 NativeError 原型对象(20.5.6.3)。每个 NativeError 构造函数都有不同的原型对象。

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

20.5.6.3 NativeError 原型对象的属性

每个 NativeError 原型对象:

  • 是普通对象。
  • 不是 Error 实例,并且没有 [[ErrorData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值是 %Error.prototype%。

20.5.6.3.1 NativeError.prototype.constructor

对于给定的 NativeError 构造函数,其原型的 "constructor" 属性的初始值是该构造函数自身。

20.5.6.3.2 NativeError.prototype.message

对于给定的 NativeError 构造函数,其原型的 "message" 属性的初始值是空 String。

20.5.6.3.3 NativeError.prototype.name

对于给定的 NativeError 构造函数,其原型的 "name" 属性的初始值是由构造函数名称(用来替代 NativeError 的名称)组成的 String 值。

20.5.6.4 NativeError 实例的属性

NativeError 实例是从其 NativeError 原型对象继承属性并具有 [[ErrorData]] 内部槽的普通对象,该内部槽的值是 undefined。[[ErrorData]] 唯一规定的用途是供 Object.prototype.toString(20.1.3.6)和 Error.isError(20.5.2.1)将 Error、AggregateError、SuppressedError 或 NativeError 实例识别出来。

20.5.7 AggregateError 对象

20.5.7.1 AggregateError 构造函数

AggregateError 构造函数:

  • 是 %AggregateError%。
  • 是全局对象的 "AggregateError" 属性的初始值。
  • 作为函数而不是构造函数调用时,创建并初始化新的 AggregateError 对象。因此,函数调用 AggregateError(…) 等价于使用相同参数的对象创建表达式 new AggregateError(…)。
  • 可以用作类定义的 extends 子句的值。希望继承指定 AggregateError 行为的子类构造函数必须包含对 AggregateError 构造函数的 super 调用,以创建并初始化具有 [[ErrorData]] 内部槽的子类实例。

20.5.7.1.1 AggregateError ( errors, message [ , options ] )

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

  1. 如果 NewTarget 是 undefined,则令 newTarget 为活动函数对象;否则令 newTarget 为 NewTarget。
  2. 令 obj 为 ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. 令 messageString 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", messageString)。
  4. 执行 ? InstallErrorCause(obj, options)。
  5. 令 errorsList 为 ? IteratorToList(? GetIterator(errors, sync))。
  6. 执行 ! DefinePropertyOrThrow(obj, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) })。
  7. 返回 obj。

20.5.7.2 AggregateError 构造函数的属性

AggregateError 构造函数:

  • 具有 [[Prototype]] 内部槽,其值是 %Error%。
  • 具有以下属性:

20.5.7.2.1 AggregateError.prototype

AggregateError.prototype 的初始值是 %AggregateError.prototype%。

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

20.5.7.3 AggregateError 原型对象的属性

AggregateError 原型对象:

  • 是 %AggregateError.prototype%。
  • 是普通对象。
  • 既不是 Error 实例也不是 AggregateError 实例,并且没有 [[ErrorData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值是 %Error.prototype%。

20.5.7.3.1 AggregateError.prototype.constructor

AggregateError.prototype.constructor 的初始值是 %AggregateError%。

20.5.7.3.2 AggregateError.prototype.message

AggregateError.prototype.message 的初始值是空 String。

20.5.7.3.3 AggregateError.prototype.name

AggregateError.prototype.name 的初始值是 "AggregateError"。

20.5.7.4 AggregateError 实例的属性

AggregateError 实例是从其 AggregateError 原型对象继承属性并具有 [[ErrorData]] 内部槽的普通对象,该内部槽的值是 undefined。[[ErrorData]] 唯一规定的用途是供 Object.prototype.toString(20.1.3.6)和 Error.isError(20.5.2.1)将 Error、AggregateError、SuppressedError 或 NativeError 实例识别出来。

20.5.8 SuppressedError 对象

20.5.8.1 SuppressedError 构造函数

SuppressedError 构造函数:

  • 是 %SuppressedError%。
  • 是全局对象的 "SuppressedError" 属性的初始值。
  • 作为函数而不是构造函数调用时,创建并初始化新的 SuppressedError 对象。因此,函数调用 SuppressedError(…) 等价于使用相同参数的对象创建表达式 new SuppressedError(…)。
  • 可以用作类定义的 extends 子句的值。希望继承指定 SuppressedError 行为的子类构造函数必须包含对 SuppressedError 构造函数的 super 调用,以创建并初始化具有 [[ErrorData]] 内部槽的子类实例。

20.5.8.1.1 SuppressedError ( error, suppressed, message )

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

  1. 如果 NewTarget 是 undefined,则令 newTarget 为活动函数对象;否则令 newTarget 为 NewTarget。
  2. 令 obj 为 ? OrdinaryCreateFromConstructor(newTarget, "%SuppressedError.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. 令 messageString 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", messageString)。
  4. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "error", error)。
  5. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "suppressed", suppressed)。
  6. 返回 obj。

20.5.8.2 SuppressedError 构造函数的属性

SuppressedError 构造函数:

  • 具有 [[Prototype]] 内部槽,其值是 %Error%。
  • 具有以下属性:

20.5.8.2.1 SuppressedError.prototype

SuppressedError.prototype 的初始值是 SuppressedError 原型对象。

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

20.5.8.3 SuppressedError 原型对象的属性

SuppressedError 原型对象:

  • 是 %SuppressedError.prototype%。
  • 是普通对象。
  • 既不是 Error 实例也不是 SuppressedError 实例,并且没有 [[ErrorData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值是 %Error.prototype%。

20.5.8.3.1 SuppressedError.prototype.constructor

SuppressedError.prototype.constructor 的初始值是 %SuppressedError%。

20.5.8.3.2 SuppressedError.prototype.message

SuppressedError.prototype.message 的初始值是空 String。

20.5.8.3.3 SuppressedError.prototype.name

SuppressedError.prototype.name 的初始值是 "SuppressedError"。

20.5.8.4 SuppressedError 实例的属性

SuppressedError 实例是从其 SuppressedError 原型对象继承属性并具有 [[ErrorData]] 内部槽的普通对象,该内部槽的值是 undefined。[[ErrorData]] 唯一规定的用途是在 Object.prototype.toString 和 Error.isError 中将 Error、AggregateError、SuppressedError 和 NativeError 实例识别为 Error 对象。

20.5.9 Error 对象的抽象操作

20.5.9.1 InstallErrorCause ( obj, options )

抽象操作 InstallErrorCause,接收参数 obj (Object) 和 options (ECMAScript 语言值);返回值:(正常完成 (值:unused) 或 抛出完成)。 当 options 上存在 "cause" 属性时,它用于在 obj 上创建 "cause" 属性。 调用时执行以下步骤:

  1. 如果 options 是 Object 且 ? HasProperty(options, "cause") 是 true,则
    1. 令 cause 为 ? Get(options, "cause")。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "cause", cause)。
  2. 返回 unused。