20 基础对象 (Fundamental Objects)

20.1 Object 对象 (Object Objects)

20.1.1 Object 构造函数 (The Object Constructor)

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 构造函数的属性 (Properties of the Object Constructor)

Object 构造函数

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

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

该函数将一个或多个源对象自身的可枚举自有属性的值拷贝到 target 对象。

调用时执行以下步骤:

  1. to 为 ? ToObject(target)。
  2. 如果只传入一个参数,返回 to
  3. sources 中每个元素 nextSource,执行
    1. 如果 nextSource 既不是 undefined 也不是 null,则
      1. from 为 ! ToObject(nextSource)。
      2. keys 为 ? from.[[OwnPropertyKeys]]()
      3. keys 中每个元素 nextKey,执行
        1. desc 为 ? from.[[GetOwnProperty]](nextKey)。
        2. 如果 desc 不为 undefineddesc.[[Enumerable]]true,则
          1. propValue 为 ? Get(from, nextKey)。
          2. 执行 ? Set(to, nextKey, propValue, true)。
  4. 返回 to

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

20.1.2.2 Object.create ( O, Properties )

该函数创建一个具有指定原型的新对象。

调用时执行以下步骤:

  1. 如果 O 不是 ObjectO 不是 null,抛出 TypeError 异常。
  2. objOrdinaryObjectCreate(O)。
  3. 如果 Properties 不是 undefined,则
    1. 返回 ? ObjectDefineProperties(obj, Properties)。
  4. 返回 obj

20.1.2.3 Object.defineProperties ( O, Properties )

该函数为对象添加自有属性和/或更新已有自有属性的特性。

调用时执行以下步骤:

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

20.1.2.3.1 ObjectDefineProperties ( O, Properties )

The abstract operation ObjectDefineProperties takes arguments O (an Object) and Properties (an ECMAScript language value) and returns 一个包含 Object 的正常完成或一个 throw completion. It performs the following steps when called:

  1. props 为 ? ToObject(Properties)。
  2. keys 为 ? props.[[OwnPropertyKeys]]()
  3. descriptors 为一个新的空列表。
  4. keys 中每个元素 nextKey,执行
    1. propDesc 为 ? props.[[GetOwnProperty]](nextKey)。
    2. 如果 propDesc 不为 undefinedpropDesc.[[Enumerable]]true,则
      1. descObj 为 ? Get(props, nextKey)。
      2. desc 为 ? ToPropertyDescriptor(descObj)。
      3. 将记录 { [[Key]]: nextKey, [[Descriptor]]: desc } 追加到 descriptors
  5. descriptors 中每个元素 property,执行
    1. 执行 ? DefinePropertyOrThrow(O, property.[[Key]], property.[[Descriptor]])。
  6. 返回 O

20.1.2.4 Object.defineProperty ( O, P, Attributes )

该函数为对象添加一个自有属性和/或更新已有自有属性的特性。

调用时执行以下步骤:

  1. 如果 O 不是 Object,抛出 TypeError 异常。
  2. key 为 ? ToPropertyKey(P)。
  3. desc 为 ? ToPropertyDescriptor(Attributes)。
  4. 执行 ? DefinePropertyOrThrow(O, key, desc)。
  5. 返回 O

20.1.2.5 Object.entries ( O )

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

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

20.1.2.6 Object.freeze ( O )

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

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

20.1.2.7 Object.fromEntries ( iterable )

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

  1. 执行 ? RequireObjectCoercible(iterable)。
  2. objOrdinaryObjectCreate(%Object.prototype%)。
  3. 断言:obj 是一个可扩展且无自有属性的普通对象
  4. 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 ( O, P )

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

  1. obj 为 ? ToObject(O)。
  2. key 为 ? ToPropertyKey(P)。
  3. desc 为 ? obj.[[GetOwnProperty]](key)。
  4. 返回 FromPropertyDescriptor(desc)。

20.1.2.9 Object.getOwnPropertyDescriptors ( O )

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

  1. obj 为 ? ToObject(O)。
  2. ownKeys 为 ? obj.[[OwnPropertyKeys]]()
  3. descriptorsOrdinaryObjectCreate(%Object.prototype%)。
  4. ownKeys 中每个元素 key,执行
    1. desc 为 ? obj.[[GetOwnProperty]](key)。
    2. descriptorFromPropertyDescriptor(desc)。
    3. 如果 descriptor 不为 undefined,执行 ! CreateDataPropertyOrThrow(descriptors, key, descriptor)。
  5. 返回 descriptors

20.1.2.10 Object.getOwnPropertyNames ( O )

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

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

20.1.2.11 Object.getOwnPropertySymbols ( O )

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

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

20.1.2.11.1 GetOwnPropertyKeys ( O, type )

The abstract operation GetOwnPropertyKeys takes arguments O (an ECMAScript language value) and type (string or symbol) and returns 一个包含属性键列表的正常完成或一个 throw completion. It performs the following steps when called:

  1. obj 为 ? ToObject(O)。
  2. keys 为 ? obj.[[OwnPropertyKeys]]()
  3. nameList 为一个新的空列表。
  4. keys 中每个元素 nextKey,执行
    1. 如果 nextKey 是 Symbol 且 typesymbol,或 nextKey 是 String 且 typestring,则
      1. nextKey 追加到 nameList
  5. 返回 nameList

20.1.2.12 Object.getPrototypeOf ( O )

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

  1. obj 为 ? ToObject(O)。
  2. 返回 ? obj.[[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 中每个记录 { [[Key]], [[Elements]] } g,执行
    1. elementsCreateArrayFromList(g.[[Elements]])。
    2. 执行 ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements)。
  4. 返回 obj

20.1.2.14 Object.hasOwn ( O, P )

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

  1. obj 为 ? ToObject(O)。
  2. key 为 ? ToPropertyKey(P)。
  3. 返回 ? HasOwnProperty(obj, key)。

20.1.2.15 Object.is ( value1, value2 )

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

  1. 返回 SameValue(value1, value2)。

20.1.2.16 Object.isExtensible ( O )

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

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

20.1.2.17 Object.isFrozen ( O )

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

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

20.1.2.18 Object.isSealed ( O )

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

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

20.1.2.19 Object.keys ( O )

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

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

20.1.2.20 Object.preventExtensions ( O )

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

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

20.1.2.21 Object.prototype

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

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

20.1.2.22 Object.seal ( O )

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

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

20.1.2.23 Object.setPrototypeOf ( O, proto )

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

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

20.1.2.24 Object.values ( O )

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

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

20.1.3 Object 原型对象的属性 (Properties of the Object Prototype 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 ( V )

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

  1. P 为 ? ToPropertyKey(V)。
  2. O 为 ? ToObject(this value)。
  3. 返回 ? HasOwnProperty(O, P)。
Note

步骤 12 的顺序确保:即使 this 值为 undefinednull,以前版本规范中应由步骤 1 抛出的异常仍会抛出。

20.1.3.3 Object.prototype.isPrototypeOf ( V )

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

  1. 如果 V 不是 Object,返回 false
  2. O 为 ? ToObject(this value)。
  3. 重复,
    1. V 为 ? V.[[GetPrototypeOf]]()
    2. 如果 Vnull,返回 false
    3. 如果 SameValue(O, V) 为 true,返回 true
Note

步骤 12 的顺序保持旧版规范在 V 非对象且 this 值为 undefinednull 时的行为。

20.1.3.4 Object.prototype.propertyIsEnumerable ( V )

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

  1. P 为 ? ToPropertyKey(V)。
  2. O 为 ? ToObject(this value)。
  3. desc 为 ? O.[[GetOwnProperty]](P)。
  4. 如果 descundefined,返回 false
  5. 返回 desc.[[Enumerable]]
Note 1

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

Note 2

步骤 12 的顺序确保:即使 this 值为 undefinednull,以前版本规范中应由步骤 1 抛出的异常仍会抛出。

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

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

  1. Othis 值。
  2. 返回 ? Invoke(O, "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 值为 undefined,返回 "[object Undefined]"
  2. 如果 this 值为 null,返回 "[object Null]"
  3. O 为 ! ToObject(this value)。
  4. isArray 为 ? IsArray(O)。
  5. 如果 isArraytrue,令 builtinTag"Array"
  6. 否则如果 O[[ParameterMap]] 内部槽,令 builtinTag"Arguments"
  7. 否则如果 O 具有 [[Call]] 内部方法,令 builtinTag"Function"
  8. 否则如果 O[[ErrorData]] 内部槽,令 builtinTag"Error"
  9. 否则如果 O[[BooleanData]] 内部槽,令 builtinTag"Boolean"
  10. 否则如果 O[[NumberData]] 内部槽,令 builtinTag"Number"
  11. 否则如果 O[[StringData]] 内部槽,令 builtinTag"String"
  12. 否则如果 O[[DateValue]] 内部槽,令 builtinTag"Date"
  13. 否则如果 O[[RegExpMatcher]] 内部槽,令 builtinTag"RegExp"
  14. 否则,令 builtinTag"Object"
  15. tag 为 ? Get(O, %Symbol.toStringTag%)。
  16. 如果 tag 不是 String,设 tagbuiltinTag
  17. 返回 "[object "tag"]" 的字符串拼接。
Note

历史上,该方法有时用于访问先前版本规范中作为各种内建对象名义类型标签的 [[Class]] 内部槽的 String 值。上述 toString 定义保持使用 toString 测试特定内建对象类型的遗留代码兼容性。它并不为其他内建或程序自定义对象类型提供可靠的类型测试机制。此外,程序可使用 %Symbol.toStringTag% 的方式破坏此类遗留类型测试的可靠性。

20.1.3.7 Object.prototype.valueOf ( )

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

  1. 返回 ? ToObject(this value)。
Normative Optional, Legacy

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. O 为 ? ToObject(this value)。
  2. 返回 ? O.[[GetPrototypeOf]]()

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 特性的值是一个接受参数 proto 的内建函数。被调用时执行:

  1. Othis 值。
  2. 执行 ? RequireObjectCoercible(O)。
  3. 如果 proto 不是 Objectproto 不是 null,返回 undefined
  4. 如果 O 不是 Object,返回 undefined
  5. status 为 ? O.[[SetPrototypeOf]](proto)。
  6. 如果 statusfalse,抛出 TypeError 异常。
  7. 返回 undefined
Normative Optional, Legacy

20.1.3.9 遗留 Object.prototype 访问器方法 (Legacy Object.prototype Accessor Methods)

20.1.3.9.1 Object.prototype.__defineGetter__ ( P, getter )

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

  1. O 为 ? ToObject(this value)。
  2. 如果 IsCallable(getter) 为 false,抛出 TypeError 异常。
  3. desc 为 PropertyDescriptor { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true }。
  4. key 为 ? ToPropertyKey(P)。
  5. 执行 ? DefinePropertyOrThrow(O, key, desc)。
  6. 返回 undefined

20.1.3.9.2 Object.prototype.__defineSetter__ ( P, setter )

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

  1. O 为 ? ToObject(this value)。
  2. 如果 IsCallable(setter) 为 false,抛出 TypeError 异常。
  3. desc 为 PropertyDescriptor { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true }。
  4. key 为 ? ToPropertyKey(P)。
  5. 执行 ? DefinePropertyOrThrow(O, key, desc)。
  6. 返回 undefined

20.1.3.9.3 Object.prototype.__lookupGetter__ ( P )

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

  1. O 为 ? ToObject(this value)。
  2. key 为 ? ToPropertyKey(P)。
  3. 重复,
    1. desc 为 ? O.[[GetOwnProperty]](key)。
    2. 如果 desc 不为 undefined,则
      1. 如果 IsAccessorDescriptor(desc) 为 true,返回 desc.[[Get]]
      2. 返回 undefined
    3. O 为 ? O.[[GetPrototypeOf]]()
    4. 如果 Onull,返回 undefined

20.1.3.9.4 Object.prototype.__lookupSetter__ ( P )

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

  1. O 为 ? ToObject(this value)。
  2. key 为 ? ToPropertyKey(P)。
  3. 重复,
    1. desc 为 ? O.[[GetOwnProperty]](key)。
    2. 如果 desc 不为 undefined,则
      1. 如果 IsAccessorDescriptor(desc) 为 true,返回 desc.[[Set]]
      2. 返回 undefined
    3. O 为 ? O.[[GetPrototypeOf]]()
    4. 如果 Onull,返回 undefined

20.1.4 Object 实例的属性 (Properties of Object Instances)

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

20.2 Function 对象 (Function Objects)

20.2.1 Function 构造函数 (The Function Constructor)

Function 构造函数

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

20.2.1.1 Function ( ...parameterArgs, bodyArg )

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

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

  1. C 为活动函数对象
  2. 如果 bodyArg 未传入,设 bodyArg 为空字符串。
  3. 返回 ? CreateDynamicFunction(C, NewTarget, normal, parameterArgs, 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 ( constructor, newTarget, kind, parameterArgs, bodyArg )

The abstract operation CreateDynamicFunction takes arguments constructor (a constructor), newTarget (a constructor or undefined), kind (normal, generator, async, or async-generator), parameterArgs (a List of ECMAScript language values), and bodyArg (an ECMAScript language value) and returns 一个包含 ECMAScript 函数对象正常完成或一个 throw completion. constructor 是正在执行该操作的构造函数newTarget 是最初由 new 应用于的构造函数parameterArgsbodyArg 反映传递给 constructor 的参数值。 It performs the following steps when called:

  1. 如果 newTargetundefined,设 newTargetconstructor
  2. 如果 kindnormal,则
    1. prefix"function"
    2. exprSym 为语法符号 FunctionExpression
    3. bodySym 为语法符号 FunctionBody[~Yield, ~Await]
    4. parameterSym 为语法符号 FormalParameters[~Yield, ~Await]
    5. fallbackProto"%Function.prototype%"
  3. 否则如果 kindgenerator,则
    1. prefix"function*"
    2. exprSymGeneratorExpression
    3. bodySymGeneratorBody
    4. parameterSymFormalParameters[+Yield, ~Await]
    5. fallbackProto"%GeneratorFunction.prototype%"
  4. 否则如果 kindasync,则
    1. prefix"async function"
    2. exprSymAsyncFunctionExpression
    3. bodySymAsyncFunctionBody
    4. parameterSymFormalParameters[~Yield, +Await]
    5. fallbackProto"%AsyncFunction.prototype%"
  5. 否则,
    1. 断言:kindasync-generator
    2. prefix"async function*"
    3. exprSymAsyncGeneratorExpression
    4. bodySymAsyncGeneratorBody
    5. parameterSymFormalParameters[+Yield, +Await]
    6. fallbackProto"%AsyncGeneratorFunction.prototype%"
  6. argCountparameterArgs 元素个数。
  7. parameterStrings 为一个新的空列表。
  8. parameterArgs 中每个元素 arg,执行
    1. 追加 ? ToString(arg) 到 parameterStrings
  9. bodyString 为 ? ToString(bodyArg)。
  10. currentRealm当前 Realm Record
  11. 执行 ? HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false)。
  12. P 为空字符串。
  13. 如果 argCount > 0,则
    1. PparameterStrings[0]。
    2. k 为 1。
    3. k < argCount,重复
      1. nextArgStringparameterStrings[k]。
      2. PP","nextArgString 的串联。
      3. kk + 1。
  14. bodyParseString 为 0x000A、bodyString、0x000A 的串联。
  15. sourceStringprefix" anonymous("P、0x000A、") {"bodyParseString"}" 的串联。
  16. sourceText 为 StringToCodePoints(sourceString)。
  17. parameters 为 ParseText(P, parameterSym)。
  18. 如果 parameters 是错误列表,抛出 SyntaxError 异常。
  19. body 为 ParseText(bodyParseString, bodySym)。
  20. 如果 body 是错误列表,抛出 SyntaxError 异常。
  21. 注:参数和主体分开解析以保证各自单独有效。例如,new Function("/*", "*/ ) {") 不会求值为函数。
  22. 注:如果到达此步骤,sourceText 必定具有 exprSym 的语法(但反向不成立)。接下来两步的目的在于强制任何直接适用于 exprSym早期错误规则
  23. expr 为 ParseText(sourceText, exprSym)。
  24. 如果 expr 是错误列表,抛出 SyntaxError 异常。
  25. proto 为 ? GetPrototypeFromConstructor(newTarget, fallbackProto)。
  26. envcurrentRealm.[[GlobalEnv]]
  27. privateEnvnull
  28. FOrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv)。
  29. 执行 SetFunctionName(F, "anonymous")。
  30. 如果 kindgenerator,则
    1. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  31. 否则如果 kindasync-generator,则
    1. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  32. 否则如果 kindnormal,则
    1. 执行 MakeConstructor(F)。
  33. 注:kindasync 的函数是不可构造的,不具有 [[Construct]] 内部方法或 "prototype" 属性。
  34. 返回 F
Note

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

20.2.2 Function 构造函数的属性 (Properties of the Function Constructor)

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 原型对象的属性 (Properties of the Function Prototype Object)

Function 原型对象

  • %Function.prototype%
  • 其自身是一个内建函数对象
  • 接受任意参数并在调用时返回 undefined
  • 没有 [[Construct]] 内部方法;不能被 new 用作构造器。
  • 具有 [[Prototype]] 内部槽,其值为 %Object.prototype%
  • 没有 "prototype" 属性。
  • "length" 属性,其值为 +0𝔽
  • "name" 属性,其值为空字符串。
Note

将 Function 原型对象指定为函数对象以确保与 ECMAScript 2015 之前代码的兼容性。

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

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

  1. functhis 值。
  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 值传递。这与第 3 版不同,后者将 undefinednullthisArg 替换为全局对象并对其他值应用 ToObject,然后传递该结果作为 this。尽管 thisArg 未被修改传递,非严格函数在进入时仍会执行这些转换。

Note 2

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

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

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

  1. Targetthis 值。
  2. 如果 IsCallable(Target) 为 false,抛出 TypeError 异常。
  3. F 为 ? BoundFunctionCreate(Target, thisArg, args)。
  4. L 为 0。
  5. targetHasLength 为 ? HasOwnProperty(Target, "length")。
  6. 如果 targetHasLengthtrue,则
    1. targetLen 为 ? Get(Target, "length")。
    2. 如果 targetLen 是 Number,则
      1. 如果 targetLen+∞𝔽,则
        1. L 为 +∞。
      2. 否则如果 targetLen-∞𝔽,则
        1. L 为 0。
      3. 否则,
        1. targetLenAsInt 为 ! ToIntegerOrInfinity(targetLen)。
        2. 断言:targetLenAsInt有限值。
        3. argCountargs 中元素数量。
        4. Lmax(targetLenAsInt - argCount, 0)。
  7. 执行 SetFunctionLength(F, L)。
  8. targetName 为 ? Get(Target, "name")。
  9. 如果 targetName 不是 String,设 targetName 为空字符串。
  10. 执行 SetFunctionName(F, targetName, "bound")。
  11. 返回 F
Note 1

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

Note 2

如果 Target 是箭头函数或绑定函数奇异对象,则后续对 F 的调用不会使用该方法传入的 thisArg

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

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

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

thisArg 值未经修改地作为 this 值传递。这与第 3 版不同(见前述说明)。

Note 2

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

20.2.3.4 Function.prototype.constructor

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

20.2.3.5 Function.prototype.toString ( )

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

  1. functhis 值。
  2. 如果 func 是 Object,且 func[[SourceText]] 内部槽,func.[[SourceText]] 是 Unicode 码点序列,且 HostHasSourceTextAvailable(func) 为 true,则
    1. 返回 CodePointsToString(func.[[SourceText]])。
  3. 如果 func 是一个 内建函数对象,返回实现定义的 func 的字符串源码表示。该表示必须具有 NativeFunction 的语法。此外,如果 func[[InitialName]] 内部槽且其为 String,则返回字符串中可被 NativeFunctionAccessoropt PropertyName 匹配的部分必须为 func.[[InitialName]]
  4. 如果 func 是 ObjectIsCallable(func) 为 true,返回实现定义的、具有 NativeFunction 语法的 func 字符串源码表示。
  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% ] ( V )

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

  1. Fthis 值。
  2. 返回 ? OrdinaryHasInstance(F, V)。

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

Note

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

v instanceof F

求值等价于

F[%Symbol.hasInstance%](v)

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

该属性不可写且不可配置,以防篡改从而可全局暴露绑定函数的目标函数。

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

20.2.4 Function 实例 (Function Instances)

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

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

未被本规范赋予上下文名称的匿名函数对象使用空字符串作为 "name" 属性的值。

20.2.4.3 prototype

可作为构造函数使用的 Function 实例具有 "prototype" 属性。每当此类 Function 实例被创建,会同时创建另一个普通对象作为函数 "prototype" 属性的初始值。除非另有说明,"prototype" 属性的值用于初始化该函数作为构造器被调用时新创建对象的 [[Prototype]] 内部槽。

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

Note

使用 Function.prototype.bind 创建的函数对象,或对一个 MethodDefinition(且不是 GeneratorMethodAsyncGeneratorMethod)或一个 ArrowFunction 求值得到的函数对象不具有 "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 对象 (Boolean Objects)

20.3.1 Boolean 构造函数 (The Boolean Constructor)

Boolean 构造函数

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

20.3.1.1 Boolean ( value )

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

  1. bToBoolean(value)。
  2. 如果 NewTarget 是 undefined,返回 b
  3. O 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)。
  4. O.[[BooleanData]]b
  5. 返回 O

20.3.2 Boolean 构造函数的属性 (Properties of the Boolean Constructor)

Boolean 构造函数

20.3.2.1 Boolean.prototype

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

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

20.3.3 Boolean 原型对象的属性 (Properties of the Boolean Prototype Object)

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. b 为 ? ThisBooleanValue(this value)。
  2. 如果 btrue,返回 "true";否则返回 "false"

20.3.3.3 Boolean.prototype.valueOf ( )

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

  1. 返回 ? ThisBooleanValue(this value)。

20.3.3.3.1 ThisBooleanValue ( value )

The abstract operation ThisBooleanValue takes argument value (an ECMAScript language value) and returns 一个包含 Boolean 的正常完成或一个 throw completion. It performs the following steps when called:

  1. 如果 value 是 Boolean,返回 value
  2. 如果 value 是 Objectvalue[[BooleanData]] 内部槽,则
    1. bvalue.[[BooleanData]]
    2. 断言:b 是 Boolean。
    3. 返回 b
  3. 抛出 TypeError 异常。

20.3.4 Boolean 实例的属性 (Properties of Boolean Instances)

Boolean 实例是继承自 Boolean 原型对象普通对象。Boolean 实例有 [[BooleanData]] 内部槽。[[BooleanData]] 内部槽是该 Boolean 对象所表示的布尔值。

20.4 Symbol 对象 (Symbol Objects)

20.4.1 Symbol 构造函数 (The Symbol Constructor)

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 构造函数的属性 (Properties of the Symbol Constructor)

Symbol 构造函数

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator 的初始值是著名符号 %Symbol.asyncIterator% (Table 1)。

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

20.4.2.2 Symbol.for ( key )

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

  1. stringKey 为 ? ToString(key)。
  2. 对 GlobalSymbolRegistry 列表中每个元素 e,执行
    1. 如果 e.[[Key]]stringKey,返回 e.[[Symbol]]
  3. 断言:GlobalSymbolRegistry 列表当前不包含 stringKey 的条目。
  4. newSymbol 为一个新 Symbol,其 [[Description]]stringKey
  5. 将记录 { [[Key]]: stringKey, [[Symbol]]: newSymbol } 追加到 GlobalSymbolRegistry 列表。
  6. 返回 newSymbol

GlobalSymbolRegistry List 是一个可追加的全局可用列表,所有 realm 共享。在任何 ECMAScript 代码执行前,它初始化为一个新的空列表。GlobalSymbolRegistry List 的元素是 Table 61 中结构的记录。

Table 61: GlobalSymbolRegistry 记录字段 (GlobalSymbolRegistry Record Fields)
Field Name Value Usage
[[Key]] a String 用于全局标识一个 Symbol 的字符串键。
[[Symbol]] a Symbol 可从任意 realm 检索的 symbol。

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance 的初始值是著名符号 %Symbol.hasInstance% (Table 1)。

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

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 的初始值是著名符号 %Symbol.isConcatSpreadable% (Table 1)。

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

20.4.2.5 Symbol.iterator

Symbol.iterator 的初始值是著名符号 %Symbol.iterator% (Table 1)。

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

20.4.2.6 Symbol.keyFor ( sym )

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

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

20.4.2.7 Symbol.match

Symbol.match 的初始值是著名符号 %Symbol.match% (Table 1)。

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

20.4.2.8 Symbol.matchAll

Symbol.matchAll 的初始值是著名符号 %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.replace% (Table 1)。

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

20.4.2.11 Symbol.search

Symbol.search 的初始值是著名符号 %Symbol.search% (Table 1)。

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

20.4.2.12 Symbol.species

Symbol.species 的初始值是著名符号 %Symbol.species% (Table 1)。

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

20.4.2.13 Symbol.split

Symbol.split 的初始值是著名符号 %Symbol.split% (Table 1)。

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

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive 的初始值是著名符号 %Symbol.toPrimitive% (Table 1)。

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

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag 的初始值是著名符号 %Symbol.toStringTag% (Table 1)。

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

20.4.2.16 Symbol.unscopables

Symbol.unscopables 的初始值是著名符号 %Symbol.unscopables% (Table 1)。

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

20.4.3 Symbol 原型对象的属性 (Properties of the Symbol Prototype Object)

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. sthis 值。
  2. sym 为 ? ThisSymbolValue(s)。
  3. 返回 sym.[[Description]]

20.4.3.3 Symbol.prototype.toString ( )

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

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

20.4.3.3.1 SymbolDescriptiveString ( sym )

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

  1. descsym.[[Description]]
  2. 如果 descundefined,设 desc 为空字符串。
  3. 断言:desc 是 String。
  4. 返回 "Symbol("desc")" 的串联。

20.4.3.4 Symbol.prototype.valueOf ( )

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

  1. 返回 ? ThisSymbolValue(this value)。

20.4.3.4.1 ThisSymbolValue ( value )

The abstract operation ThisSymbolValue takes argument value (an ECMAScript language value) and returns 一个包含 Symbol 的正常完成或一个 throw completion. It performs the following steps when called:

  1. 如果 value 是 Symbol,返回 value
  2. 如果 value 是 Objectvalue[[SymbolData]] 内部槽,则
    1. svalue.[[SymbolData]]
    2. 断言:s 是 Symbol。
    3. 返回 s
  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 实例的属性 (Properties of Symbol Instances)

Symbol 实例是继承自 Symbol 原型对象普通对象,并具有 [[SymbolData]] 内部槽。[[SymbolData]] 内部槽是该 Symbol 对象所表示的 Symbol 值。

20.4.5 Symbol 的抽象操作 (Abstract Operations for Symbols)

20.4.5.1 KeyForSymbol ( sym )

The abstract operation KeyForSymbol takes argument sym (a Symbol) and returns a String or undefined. 如果 sym 在 GlobalSymbolRegistry 列表中,则返回用于注册 sym 的 String。 It performs the following steps when called:

  1. 对 GlobalSymbolRegistry 列表中每个元素 e,执行
    1. 如果 SameValue(e.[[Symbol]], sym) 为 true,返回 e.[[Key]]
  2. 断言:GlobalSymbolRegistry 列表当前不包含 sym 的条目。
  3. 返回 undefined

20.5 Error 对象 (Error Objects)

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

当 ECMAScript 实现检测到运行时错误时,它会抛出 20.5.5 中定义的 NativeError 对象之一的新实例,或 20.5.7 中定义的 AggregateError 对象的新实例。

20.5.1 Error 构造函数 (The Error Constructor)

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. O 为 ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. 执行 ? InstallErrorCause(O, options)。
  5. 返回 O

20.5.2 Error 构造函数的属性 (Properties of the Error Constructor)

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 原型对象的属性 (Properties of the Error Prototype Object)

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 的初始值是空字符串。

20.5.3.3 Error.prototype.name

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

20.5.3.4 Error.prototype.toString ( )

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

  1. Othis 值。
  2. 如果 O 不是 Object,抛出 TypeError 异常。
  3. name 为 ? Get(O, "name")。
  4. 如果 nameundefined,设 name"Error";否则设 name 为 ? ToString(name)。
  5. msg 为 ? Get(O, "message")。
  6. 如果 msgundefined,设 msg 为空字符串;否则设 msg 为 ? ToString(msg)。
  7. 如果 name 是空字符串,返回 msg
  8. 如果 msg 是空字符串,返回 name
  9. 返回 name、0x003A (COLON)、0x0020 (SPACE) 与 msg 的字符串拼接。

20.5.4 Error 实例的属性 (Properties of Error Instances)

Error 实例是继承自 Error 原型对象普通对象,并具有值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 的唯一规定用途是让 Object.prototype.toString (20.1.3.6) 与 Error.isError (20.5.2.1) 用于识别 Error、AggregateError 与 NativeError 实例。

20.5.5 本标准使用的原生错误类型 (Native Error Types Used in This Standard)

检测到运行时错误时,会抛出以下 NativeError 对象之一或 AggregateError 对象的新实例。所有 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%

TypeError 用于指示一次操作失败,且其他 NativeError 对象都不适合作为失败原因的指示。

20.5.5.6 URIError

URIError 构造函数%URIError%

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

20.5.6 NativeError 对象结构 (NativeError Object Structure)

这些对象各自具有下面描述的结构,唯一区别在于使用的构造函数名称及其原型对象的 "name" 属性。

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

20.5.6.1 NativeError 构造函数 (The NativeError Constructors)

每个 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. O 为 ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不是 undefined,则
    1. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. 执行 ? InstallErrorCause(O, options)。
  5. 返回 O

在步骤 2 中传递的字符串的实际值根据具体构造函数分别是 "%EvalError.prototype%""%RangeError.prototype%""%ReferenceError.prototype%""%SyntaxError.prototype%""%TypeError.prototype%""%URIError.prototype%"

20.5.6.2 NativeError 构造函数的属性 (Properties of the NativeError Constructors)

每个 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 原型对象的属性 (Properties of the NativeError Prototype Objects)

每个 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" 属性初始值是空字符串。

20.5.6.3.3 NativeError.prototype.name

给定 NativeError 构造函数的原型的 "name" 属性初始值是构造函数名称(替换 NativeError 的名称)的 String 值。

20.5.6.4 NativeError 实例的属性 (Properties of NativeError Instances)

NativeError 实例是继承自其 NativeError 原型对象的普通对象,并具有值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 的唯一规定用途是由 Object.prototype.toString (20.1.3.6) 和 Error.isError (20.5.2.1) 用于识别 Error、AggregateError 或 NativeError 实例。

20.5.7 AggregateError 对象 (AggregateError Objects)

20.5.7.1 AggregateError 构造函数 (The AggregateError Constructor)

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. O 为 ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] »)。
  3. 如果 message 不为 undefined,则
    1. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. 执行 ? InstallErrorCause(O, options)。
  5. errorsList 为 ? IteratorToList(? GetIterator(errors, sync))。
  6. 执行 ! DefinePropertyOrThrow(O, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) })。
  7. 返回 O

20.5.7.2 AggregateError 构造函数的属性 (Properties of the AggregateError Constructor)

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 原型对象的属性 (Properties of the AggregateError Prototype Object)

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 的初始值是空字符串。

20.5.7.3.3 AggregateError.prototype.name

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

20.5.7.4 AggregateError 实例的属性 (Properties of AggregateError Instances)

AggregateError 实例是继承自其 AggregateError 原型对象普通对象,并具有值为 undefined[[ErrorData]] 内部槽。[[ErrorData]] 的唯一规定用途是由 Object.prototype.toString (20.1.3.6) 和 Error.isError (20.5.2.1) 用于识别 Error、AggregateError 或 NativeError 实例。

20.5.8 Error 对象的抽象操作 (Abstract Operations for Error Objects)

20.5.8.1 InstallErrorCause ( O, options )

The abstract operation InstallErrorCause takes arguments O (an Object) and options (an ECMAScript language value) and returns 一个包含 unused正常完成或一个 throw completion. 当 options 上存在 "cause" 属性时用于在 O 上创建 "cause" 属性。 It performs the following steps when called:

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