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 构造函数:

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 ( proto, properties )

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

调用时执行下列步骤:

  1. 如果 proto 既不是一个 Object 也不是 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. 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(obj, property.[[Key]], property.[[Descriptor]])。
  6. 返回 obj

20.1.2.4 Object.defineProperty ( obj, propertyKey, attributes )

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

调用时执行下列步骤:

  1. 如果 obj 不是一个 Object,抛出 TypeError 异常。
  2. key 为 ? ToPropertyKey(propertyKey)。
  3. desc 为 ? ToPropertyDescriptor(attributes)。
  4. 执行 ? DefinePropertyOrThrow(obj, key, desc)。
  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 为一个新的抽象闭包,参数为 (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
The function created for adder is never directly accessible to ECMAScript code.

20.1.2.8 Object.getOwnPropertyDescriptor ( obj, propertyKey )

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

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

20.1.2.9 Object.getOwnPropertyDescriptors ( obj )

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

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

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

20.1.2.14 Object.hasOwn ( obj, propertyKey )

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

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

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 也不是 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 的执行顺序,是为了确保在本规范早期版本中会被步骤 1 抛出的任何异常,即便 this 值为 undefinednull,仍会继续被抛出。

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 值为 undefinednull 的情况所指定的行为得以保留。

20.1.3.4 Object.prototype.propertyIsEnumerable ( value )

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

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

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

Note 2

选择步骤 12 的执行顺序,是为了确保在本规范早期版本中会被步骤 1 抛出的任何异常,即便 this 值为 undefinednull,仍会继续被抛出。

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

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

  1. thisValuethis 值。
  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 值为 undefined,返回 "[object Undefined]"
  2. 如果 this 值为 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]] 内部槽的字符串值。上述 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. obj 为 ? ToObject(this value)。
  2. 返回 ? obj.[[GetPrototypeOf]]()

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 属性的值是一个接受参数 proto 的内建函数。调用时执行下列步骤:

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

20.1.3.9 遗留的 Object.prototype 访问器方法

20.1.3.9.1 Object.prototype.__defineGetter__ ( propertyKey, getter )

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

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

20.1.3.9.2 Object.prototype.__defineSetter__ ( propertyKey, setter )

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

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

20.1.3.9.3 Object.prototype.__lookupGetter__ ( propertyKey )

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

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

20.1.3.9.4 Object.prototype.__lookupSetter__ ( propertyKey )

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

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

20.1.4 对象实例的属性

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

20.2 函数对象

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 ( ...parameterArgs, bodyArg )

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

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

  1. constructor活动函数对象
  2. 如果 bodyArg 缺失,将 bodyArg 设为空字符串。
  3. 返回 ? CreateDynamicFunction(constructor, 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 either a normal completion containing an ECMAScript function object or a throw completion. constructor 是执行此操作的构造函数。newTarget 是最初被 new 应用的构造函数。parameterArgsbodyArg 反映传递给 constructor 的参数值。 It performs the following steps when called:

  1. 如果 newTargetundefined,将 newTarget 设为 constructor
  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. exprSym 为语法符号 GeneratorExpression
    3. bodySym 为语法符号 GeneratorBody
    4. parameterSym 为语法符号 FormalParameters[+Yield, ~Await]
    5. fallbackProto"%GeneratorFunction.prototype%"
  4. 否则如果 kindasync,则
    1. prefix"async function"
    2. exprSym 为语法符号 AsyncFunctionExpression
    3. bodySym 为语法符号 AsyncFunctionBody
    4. parameterSym 为语法符号 FormalParameters[~Yield, +Await]
    5. fallbackProto"%AsyncFunction.prototype%"
  5. 否则,
    1. 断言:kindasync-generator
    2. prefix"async function*"
    3. exprSym 为语法符号 AsyncGeneratorExpression
    4. bodySym 为语法符号 AsyncGeneratorBody
    5. parameterSym 为语法符号 FormalParameters[+Yield, +Await]
    6. fallbackProto"%AsyncGeneratorFunction.prototype%"
  6. argCountparameterArgs 中元素的数量。
  7. parameterStrings 为新的空列表。
  8. parameterArgs 的每个元素 arg 执行
    1. 将 ? ToString(arg) 附加到 parameterStrings
  9. bodyString 为 ? ToString(bodyArg)。
  10. currentRealm 为当前的 Realm 记录。
  11. 执行 ? HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false)。
  12. parameterString 为空字符串。
  13. 如果 argCount > 0,则
    1. parameterString 设为 parameterStrings[0]。
    2. k 为 1。
    3. 重复,直到 k < argCount
      1. nextArgStringparameterStrings[k]。
      2. parameterString 设为字符串拼接 parameterString","(逗号)与 nextArgString
      3. k 设为 k + 1。
  14. bodyParseString 为字符串拼接 0x000A (LINE FEED)、bodyString、和 0x000A (LINE FEED)。
  15. sourceString 为字符串拼接 prefix" anonymous(", parameterString、0x000A (LINE FEED)、") {"bodyParseString、和 "}"
  16. sourceTextStringToCodePoints(sourceString)。
  17. parametersParseText(parameterString, parameterSym)。
  18. 如果 parameters 是一个错误列表,抛出 SyntaxError 异常。
  19. bodyParseText(bodyParseString, bodySym)。
  20. 如果 body 是一个错误列表,抛出 SyntaxError 异常。
  21. 注意:参数与函数体分别解析以确保各自单独有效。例如,new Function("/*", "*/ ) {") 不会被解析为一个函数。
  22. 注意:如果到达此步骤,sourceText 必定具有 exprSym 的语法(尽管反向不成立)。下面两步的目的是强制应用直接作用于 exprSym 的任何早期错误规则
  23. exprParseText(sourceText, exprSym)。
  24. 如果 expr 是一个错误列表,抛出 SyntaxError 异常。
  25. proto 为 ? GetPrototypeFromConstructor(newTarget, fallbackProto)。
  26. envcurrentRealm.[[GlobalEnv]]
  27. privateEnvnull
  28. funcOrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv)。
  29. 执行 SetFunctionName(func, "anonymous")。
  30. 如果 kindgenerator,则
    1. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  31. 否则如果 kindasync-generator,则
    1. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)。
    2. 执行 ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  32. 否则如果 kindnormal,则
    1. 执行 MakeConstructor(func)。
  33. 注意:kindasync 的函数不可构造,且不具有 [[Construct]] 内部方法或 "prototype" 属性。
  34. 返回 func
Note

CreateDynamicFunction 会在其创建的任何非 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" 属性,其值为空字符串。
Note

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

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 版不同,第 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. boundFunc 为 ? BoundFunctionCreate(target, thisArg, args)。
  4. length 为 0。
  5. targetHasLength 为 ? HasOwnProperty(target, "length")。
  6. 如果 targetHasLengthtrue,则
    1. targetLen 为 ? Get(target, "length")。
    2. 如果 targetLen 是一个 Number,则
      1. 如果 targetLen+∞𝔽,则
        1. length 设为 +∞。
      2. 否则如果 targetLen-∞𝔽,则
        1. length 设为 0。
      3. 否则,
        1. targetLenAsInt 为 ! ToIntegerOrInfinity(targetLen)。
        2. 断言:targetLenAsInt有限的。
        3. argCountargs 中元素的数量。
        4. length 设为 max(targetLenAsInt - argCount, 0)。
  7. 执行 SetFunctionLength(boundFunc, length)。
  8. targetName 为 ? Get(target, "name")。
  9. 如果 targetName 不是一个 String,将 targetName 设为空字符串。
  10. 执行 SetFunctionName(boundFunc, targetName, "bound")。
  11. 返回 boundFunc
Note 1

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

Note 2

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

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

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]] 内部槽且 func.[[InitialName]] 是一个字符串,则返回字符串中可由 NativeFunctionAccessoropt PropertyName 匹配的部分必须为 func.[[InitialName]]
  4. 如果 func 是一个 Object 且 IsCallable(func) 为 true,返回由实现定义func 的字符串源代码表示。该表示必须具有 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 值。
  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 函数实例

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

函数实例具有下列属性:

20.2.4.1 length

"length" 属性的值是一个整数 Number,指示函数期望的典型参数数量。然而,语言允许以其他数量的参数调用函数。函数在被以与其 "length" 属性不同的参数数量调用时的行为取决于该函数。此属性具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

20.2.4.2 name

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

未由本规范在上下文中关联名称的匿名函数对象使用空字符串作为 "name" 属性的值。

20.2.4.3 prototype

可用作构造函数的函数实例具有 "prototype" 属性。每当创建这样的函数实例时,也会创建另一个普通对象作为该函数 "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 对象

20.3.1 Boolean 构造函数

Boolean 构造函数:

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

20.3.1.1 Boolean ( value )

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

  1. bToBoolean(value)。
  2. 如果 NewTarget 为 undefined,返回 b
  3. obj 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)。
  4. obj.[[BooleanData]] 设为 b
  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. b 为 ? ThisBooleanValue(this value)。
  2. 如果 btrue,返回 "true"
  3. 返回 "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 either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

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

20.3.4 Boolean 实例的属性

Boolean 实例是普通对象,从 Boolean 原型对象继承属性。Boolean 实例具有一个 [[BooleanData]] 内部槽。[[BooleanData]] 内部槽是该 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.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. 将 GlobalSymbolRegistry 记录 { [[Key]]: stringKey, [[Symbol]]: newSymbol } 附加到 GlobalSymbolRegistry 列表
  6. 返回 newSymbol

GlobalSymbolRegistry 列表 是一个追加专用的全局可用列表,由所有 realms 共享。在评估任何 ECMAScript 代码之前,它被初始化为空列表。GlobalSymbolRegistry 列表的元素是具有 Table 58 中定义结构的记录。

Table 58: GlobalSymbolRegistry 记录字段
字段名 用途
[[Key]] 一个 String 用于全局标识一个 Symbol 的字符串键。
[[Symbol]] 一个 Symbol 一个可以从任何 realm 检索的符号。

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 原型对象的属性

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 是一个访问器属性,其设置访问器函数为 undefined。其获取访问器函数在调用时执行下列步骤:

  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 是一个字符串。
  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 either a normal completion containing a Symbol or a throw completion. It performs the following steps when called:

  1. 如果 value 是一个 Symbol,返回 value
  2. 如果 value 是一个 Object 且 value[[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% 属性的初始值为字符串 "Symbol"

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

20.4.4 Symbol 实例的属性

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

20.4.5 关于符号的抽象操作

20.4.5.1 KeyForSymbol ( sym )

The abstract operation KeyForSymbol takes argument sym (a Symbol) and returns a String or undefined. 如果 symGlobalSymbolRegistry 列表中,则返回用于注册 sym 的字符串。 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 对象的实例在运行时错误发生时被作为异常抛出。Error 对象也可作为用户定义异常类的基对象。

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

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. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)。
  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 的初始值为空字符串。

20.5.3.3 Error.prototype.name

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

20.5.3.4 Error.prototype.toString ( )

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

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

20.5.4 Error 实例的属性

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

20.5.5 本规范中使用的原生错误类型

当检测到运行时错误时,会抛出下列某个 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%

当没有其它 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. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)。
  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" 属性,其值为字符串 "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" 属性的初始值为空字符串。

20.5.6.3.3 NativeError.prototype.name

给定 NativeError 构造函数的原型的 "name" 属性的初始值为构造函数的名称(用于替代 NativeError 的名称)。

20.5.6.4 NativeError 实例的属性

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 对象

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. msg 为 ? ToString(message)。
    2. 执行 CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)。
  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 的初始值为空字符串。

20.5.7.3.3 AggregateError.prototype.name

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

20.5.7.4 AggregateError 实例的属性

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 对象的抽象操作

20.5.8.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