20 基本对象

20.1 Object 对象

20.1.1 Object 构造器

Object 构造器:

  • %Object%
  • 全局对象"Object" 属性的初始值。
  • 在作为构造器调用时创建一个新的普通对象
  • 在作为函数而非构造器调用时执行类型转换。
  • 可以用作类定义的 extends 子句的值。

20.1.1.1 Object ( value )

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

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

20.1.2 Object 构造器的属性

Object 构造器:

  • 具有一个 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • 具有以下附加属性:

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 不是 undefinedpropertyDesc.[[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. objOrdinaryObjectCreate(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 )

The abstract operation ObjectDefineProperties takes arguments obj (an Object) and properties (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. properties 设置为 ? ToObject(properties)。
  2. keys 为 ? properties.[[OwnPropertyKeys]]()
  3. propertyDescs 为新的空 List
  4. keys 的每个元素 nextKey,执行:
    1. currentPropertyDesc 为 ? properties.[[GetOwnProperty]](nextKey)
    2. 如果 currentPropertyDesc 不是 undefinedcurrentPropertyDesc.[[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. 如果 statusfalse,则抛出 TypeError 异常。
  4. 返回 obj

20.1.2.7 Object.fromEntries ( iterable )

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

  1. 执行 ? RequireObjectCoercible(iterable)。
  2. objOrdinaryObjectCreate(%Object.prototype%)。
  3. 断言:obj 是一个可扩展、没有自身属性的普通对象
  4. closure 为一个新的 Abstract Closure,它具有参数 (key, value)、捕获 obj,并在被调用时执行以下步骤:
    1. propertyKey 为 ? ToPropertyKey(key)。
    2. 执行 ! CreateDataPropertyOrThrow(obj, propertyKey, value)。
    3. 返回 NormalCompletion(undefined)。
  5. adderCreateBuiltinFunction(closure, 2, "", « »)。
  6. 返回 ? AddEntriesFromIterable(obj, iterable, adder)。
Note
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. descsOrdinaryObjectCreate(%Object.prototype%)。
  4. ownKeys 的每个元素 key,执行:
    1. propertyDesc 为 ? coerced.[[GetOwnProperty]](key)
    2. propertyDescObjFromPropertyDescriptor(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 )

The abstract operation GetOwnPropertyKeys takes arguments value (an ECMAScript language value) and type (string or symbol) and returns either a normal completion containing a List of property keys or a throw completion. It performs the following steps when called:

  1. obj 为 ? ToObject(value)。
  2. keys 为 ? obj.[[OwnPropertyKeys]]()
  3. nameList 为新的空 List
  4. keys 的每个元素 nextKey,执行:
    1. 如果 nextKey 是 Symbol 且 typesymbol,或如果 nextKey 是 String 且 typestring,则
      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 )

Note

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

callback 会带两个实参调用:元素的值和元素的索引。

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

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

  1. groups 为 ? GroupBy(items, callback, property)。
  2. objOrdinaryObjectCreate(null)。
  3. groups 的每个 Record { [[Key]], [[Elements]] } group,执行:
    1. elementsCreateArrayFromList(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. 如果 statusfalse,则抛出 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. 如果 statusfalse,则抛出 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. 如果 statusfalse,则抛出 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)。
Note

步骤 12 的顺序被选择为确保,即使 this value 是 undefinednull,本规范先前版本中本应由步骤 1 抛出的任何异常也会继续被抛出。

20.1.3.3 Object.prototype.isPrototypeOf ( value )

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

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

步骤 12 的顺序,保留了本规范先前版本为 value 不是对象且 this value 是 undefinednull 的情况所规定的行为。

20.1.3.4 Object.prototype.propertyIsEnumerable ( value )

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

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

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

Note 2

步骤 12 的顺序被选择为确保,即使 this value 是 undefinednull,本规范先前版本中本应由步骤 1 抛出的任何异常也会继续被抛出。

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

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

  1. thisValuethis value。
  2. 返回 ? Invoke(thisValue, "toString")。

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

Note 1

此方法为没有区域设置敏感 toString 行为的对象提供一个通用 toLocaleString 实现。ArrayNumberDate%TypedArray% 提供它们自己的区域设置敏感 toLocaleString 方法。

Note 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. 如果 isArraytrue,则令 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"]"字符串连接
Note

从历史上看,此方法偶尔用于访问 [[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 }。[[Get]][[Set]] 特性定义如下:

20.1.3.8.1 get Object.prototype.__proto__

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

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

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 特性的值是一个接受实参 proto 的内置函数。它在被调用时执行以下步骤:

  1. thisValuethis value。
  2. 执行 ? RequireObjectCoercible(thisValue)。
  3. 如果 proto 不是 Object 且 proto 不是 null,则返回 undefined
  4. 如果 thisValue 不是 Object,则返回 undefined
  5. status 为 ? thisValue.[[SetPrototypeOf]](proto)
  6. 如果 statusfalse,则抛出 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 { [[Get]]: 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 { [[Set]]: 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.[[Get]]
      2. 返回 undefined
    3. obj 设置为 ? obj.[[GetPrototypeOf]]()
    4. 如果 objnull,则返回 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.[[Set]]
      2. 返回 undefined
    3. obj 设置为 ? obj.[[GetPrototypeOf]]()
    4. 如果 objnull,则返回 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)。
Note

可以但不必为要指定的每个形式参数提供一个实参。例如,以下三个表达式都会产生相同结果:

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 )

The abstract operation CreateDynamicFunction takes arguments ctor (a constructor), newTarget (a constructor or undefined), kind (normal, generator, async, or async-generator), paramArgs (a List of ECMAScript language values), and bodyArg (an ECMAScript language value) and returns either a normal completion containing an ECMAScript function object or a throw completion. ctor 是执行此动作的构造器函数。newTarget 是最初应用 new 的构造器。paramArgsbodyArg 反映传给 ctor 的实参值。 It performs the following steps when called:

  1. 如果 newTargetundefined,则将 newTarget 设置为 ctor
  2. 如果 kindnormal,则
    1. prefix"function"
    2. exprGrammar 为文法符号 FunctionExpression
    3. bodyGrammar 为文法符号 FunctionBody[~Yield, ~Await]
    4. paramGrammar 为文法符号 FormalParameters[~Yield, ~Await]
    5. fallbackProto"%Function.prototype%"
  3. 否则,如果 kindgenerator,则
    1. prefix"function*"
    2. exprGrammar 为文法符号 GeneratorExpression
    3. bodyGrammar 为文法符号 GeneratorBody
    4. paramGrammar 为文法符号 FormalParameters[+Yield, ~Await]
    5. fallbackProto"%GeneratorFunction.prototype%"
  4. 否则,如果 kindasync,则
    1. prefix"async function"
    2. exprGrammar 为文法符号 AsyncFunctionExpression
    3. bodyGrammar 为文法符号 AsyncFunctionBody
    4. paramGrammar 为文法符号 FormalParameters[~Yield, +Await]
    5. fallbackProto"%AsyncFunction.prototype%"
  5. 否则,
    1. 断言:kindasync-generator
    2. prefix"async function*"
    3. exprGrammar 为文法符号 AsyncGeneratorExpression
    4. bodyGrammar 为文法符号 AsyncGeneratorBody
    5. paramGrammar 为文法符号 FormalParameters[+Yield, +Await]
    6. fallbackProto"%AsyncGeneratorFunction.prototype%"
  6. argCountparamArgs 中元素的数量。
  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. nextArgStringparamStrings[k]。
      2. paramString 设置为 paramString","(逗号)和 nextArgString字符串连接
      3. k 设置为 k + 1。
  14. bodyParseString 为 0x000A(LINE FEED)、bodyString 和 0x000A(LINE FEED)的字符串连接
  15. sourceStringprefix" anonymous("paramString、0x000A(LINE FEED)、") {"bodyParseString"}"字符串连接
  16. sourceTextStringToCodePoints(sourceString)。
  17. paramsParseText(paramString, paramGrammar)。
  18. 如果 params 是错误列表,则抛出 SyntaxError 异常。
  19. bodyParseText(bodyParseString, bodyGrammar)。
  20. 如果 body 是错误列表,则抛出 SyntaxError 异常。
  21. 注:参数和主体会分别解析,以确保它们各自单独有效。例如,new Function("/*", "*/ ) {") 不会求值为一个函数。
  22. 注:如果到达此步骤,则 sourceText 必须具有 exprGrammar 的语法(尽管其逆命题不成立)。接下来两个步骤的目的是强制执行任何直接适用于 exprGrammar早期错误规则。
  23. exprParseText(sourceText, exprGrammar)。
  24. 如果 expr 是错误列表,则抛出 SyntaxError 异常。
  25. funcProto 为 ? GetPrototypeFromConstructor(newTarget, fallbackProto)。
  26. envRecordcurrentRealm.[[GlobalEnv]]
  27. privateEnvnull
  28. funcOrdinaryFunctionCreate(funcProto, sourceText, params, body, non-lexical-this, envRecord, privateEnv)。
  29. 执行 SetFunctionName(func, "anonymous")。
  30. 如果 kindgenerator,则
    1. protoProtoOrdinaryObjectCreate(%GeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: protoProto, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  31. 否则,如果 kindasync-generator,则
    1. protoProtoOrdinaryObjectCreate(%AsyncGeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: protoProto, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  32. 否则,如果 kindnormal,则
    1. 执行 MakeConstructor(func)。
  33. 注:kindasync 的函数不可构造,并且没有 [[Construct]] 内部方法或 "prototype" 属性。
  34. 返回 func
Note

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。
Note

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

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

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

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

thisArg 值会不经修改地作为 this value 传入。这是相对于第 3 版的一个变化,在第 3 版中,undefinednullthisArg 会被替换为全局对象,且 ToObject 会应用于所有其他值,并将该结果作为 this value 传入。即使 thisArg 会不经修改地传入,非严格函数在进入函数时仍会执行这些转换。

Note 2

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

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

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

  1. targetthis value。
  2. 如果 IsCallable(target) 是 false,则抛出 TypeError 异常。
  3. boundFunc 为 ? BoundFunctionCreate(target, thisArg, args)。
  4. length 为 0。
  5. targetHasLength 为 ? HasOwnProperty(target, "length")。
  6. 如果 targetHasLengthtrue,则
    1. targetLength 为 ? Get(target, "length")。
    2. 如果 targetLength 是 Number,则
      1. 如果 targetLength+∞𝔽,则
        1. length 设置为 +∞。
      2. 否则,如果 targetLength-∞𝔽,则
        1. length 设置为 0。
      3. 否则,
        1. targetLengthAsInt 为 ! ToIntegerOrInfinity(targetLength)。
        2. 断言:targetLengthAsInt有限的。
        3. argCountargs 中元素的数量。
        4. 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
Note 1

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

Note 2

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

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

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

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

thisArg 值会不经修改地作为 this value 传入。这是相对于第 3 版的一个变化,在第 3 版中,undefinednullthisArg 会被替换为全局对象,且 ToObject 会应用于所有其他值,并将该结果作为 this value 传入。即使 thisArg 会不经修改地传入,非严格函数在进入函数时仍会执行这些转换。

Note 2

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

20.2.3.4 Function.prototype.constructor

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

20.2.3.5 Function.prototype.toString ( )

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

  1. functhis 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. thisValuethis value。
  2. 返回 ? OrdinaryHasInstance(thisValue, value)。

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

Note

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

v instanceof F

的表达式会求值为

F[%Symbol.hasInstance%](v)

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

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

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

20.2.4 Function 实例

每个 Function 实例都是 ECMAScript 函数对象,并具有 Table 26 中列出的内部槽。使用 Function.prototype.bind 方法(20.2.3.2)创建的 Function 对象具有 Table 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 }。

Note

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

20.2.5 HostHasSourceTextAvailable ( func )

The host-defined abstract operation HostHasSourceTextAvailable takes argument func (a function object) and returns a 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. boolToBoolean(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. 如果 booltrue,则返回 "true"
  3. 返回 "false"

20.3.3.3 Boolean.prototype.valueOf ( )

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

  1. 返回 ? ThisBooleanValue(this value)。

20.3.3.3.1 ThisBooleanValue ( arg )

The abstract operation ThisBooleanValue takes argument arg (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. 如果 arg 是 Boolean,则返回 arg
  2. 如果 arg 是 Object 且 arg 具有 [[BooleanData]] 内部槽,则
    1. boolarg.[[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. 如果 descriptionundefined,则令 descStringundefined
  3. 否则,令 descString 为 ? ToString(description)。
  4. 返回一个新的 Symbol,其 [[Description]]descString

20.4.2 Symbol 构造器的属性

Symbol 构造器:

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator 的初始值是知名 symbol %Symbol.asyncIterator%Table 1)。

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

20.4.2.2 Symbol.for ( key )

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

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

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance 的初始值是知名 symbol %Symbol.hasInstance%Table 1)。

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

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 的初始值是知名 symbol %Symbol.isConcatSpreadable%Table 1)。

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

20.4.2.5 Symbol.iterator

Symbol.iterator 的初始值是知名 symbol %Symbol.iterator%Table 1)。

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

20.4.2.6 Symbol.keyFor ( symbol )

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

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

20.4.2.7 Symbol.match

Symbol.match 的初始值是知名 symbol %Symbol.match%Table 1)。

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

20.4.2.8 Symbol.matchAll

Symbol.matchAll 的初始值是知名 symbol %Symbol.matchAll%Table 1)。

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

20.4.2.9 Symbol.prototype

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

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

20.4.2.10 Symbol.replace

Symbol.replace 的初始值是知名 symbol %Symbol.replace%Table 1)。

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

20.4.2.11 Symbol.search

Symbol.search 的初始值是知名 symbol %Symbol.search%Table 1)。

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

20.4.2.12 Symbol.species

Symbol.species 的初始值是知名 symbol %Symbol.species%Table 1)。

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

20.4.2.13 Symbol.split

Symbol.split 的初始值是知名 symbol %Symbol.split%Table 1)。

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

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive 的初始值是知名 symbol %Symbol.toPrimitive%Table 1)。

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

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag 的初始值是知名 symbol %Symbol.toStringTag%Table 1)。

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

20.4.2.16 Symbol.unscopables

Symbol.unscopables 的初始值是知名 symbol %Symbol.unscopables%Table 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 )

The abstract operation SymbolDescriptiveString takes argument symbol (a Symbol) and returns a String. It performs the following steps when called:

  1. descriptionsymbol.[[Description]]
  2. 如果 descriptionundefined,则将 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 )

The abstract operation ThisSymbolValue takes argument arg (an ECMAScript language value) and returns either a normal completion containing a Symbol or a throw completion. It performs the following steps when called:

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

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

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

它在被调用时执行以下步骤:

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

该实参会被忽略。

此属性具有特性 { [[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 记录

GlobalSymbolRegistry 记录是一个记录值,用于将一个字符串键与通过 Symbol.for 注册的 Symbol 值相关联。

GlobalSymbolRegistry 记录具有 Table 59 中列出的字段。

Table 59: GlobalSymbolRegistry 记录字段
字段名称 用法
[[Key]] 一个字符串 一个用于全局标识 Symbol 的字符串键。
[[Symbol]] 一个 Symbol 一个可从任何 realm 中检索到的 symbol。

20.4.5.2 KeyForSymbol ( symbol )

The abstract operation KeyForSymbol takes argument symbol (a Symbol) and returns a String or undefined. 如果 symbol 位于周围代理的 [[GlobalSymbolRegistry]] 列表中,则返回用于注册 symbol 的字符串。 It performs the following steps when called:

  1. agentRecord 为周围代理的代理记录。
  2. globalSymbolRegistryagentRecord.[[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. objthis value。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. name 为 ? Get(obj, "name")。
  4. 如果 nameundefined,则将 name 设置为 "Error";否则将 name 设置为 ? ToString(name)。
  5. message 为 ? Get(obj, "message")。
  6. 如果 messageundefined,则将 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 原型对象继承属性,并具有一个值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 唯一规定的用途,是在 Object.prototype.toStringError.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 原型对象继承属性,并具有一个值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 唯一规定的用途,是由 Object.prototype.toString20.1.3.6)和 Error.isError20.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 原型对象继承属性,并具有一个值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 唯一规定的用途,是由 Object.prototype.toString20.1.3.6)和 Error.isError20.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 构造函数

  • 具有一个值为 %Error%[[Prototype]] 内部槽。
  • 具有以下属性:

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]] 内部槽。
  • 具有一个值为 %Error.prototype%[[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 原型对象继承属性,并具有一个值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 唯一规定的用途,是在 Object.prototype.toStringError.isError 中将 Error、AggregateError、SuppressedError 和 NativeError 实例识别为 Error 对象。

20.5.9 Error 对象的抽象操作

20.5.9.1 InstallErrorCause ( obj, options )

The abstract operation InstallErrorCause takes arguments obj (an Object) and options (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 当 options 上存在 "cause" 属性时,它用于在 obj 上创建 "cause" 属性。 It performs the following steps when called:

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