18 ECMAScript 标准内置对象
每当 ECMAScript Script 或 Module 开始执行时,都有某些内置对象可用。其中一个是全局对象,它是正在执行程序的全局环境的一部分。其他对象可作为全局对象的初始属性直接访问,或者作为可访问内置对象的属性间接访问。
除非另有规定,可作为函数调用的内置对象都是具有 10.3 中所述特征的内置函数对象。除非另有规定,内置对象的 [[Extensible]] 内部槽初始值为 true。每个内置函数对象都具有 [[Realm]] 内部槽,其值是最初创建该对象的 realm 的 Realm Record。
许多内置对象都是函数:可以使用参数调用它们。其中一些还是构造函数:它们是旨在与 new 运算符一起使用的函数。对于每个内置函数,本规范描述该函数所需的参数以及该函数对象的属性。对于每个内置构造函数,本规范还描述该构造函数的原型对象的属性,以及调用该构造函数的 new 表达式所返回的特定对象实例的属性。
除非特定函数的描述中另有规定,如果为内置函数或构造函数提供的参数少于规定所需数量,则该函数或构造函数的行为应与为其提供了足够的额外参数完全相同,并且每个此类参数的值都是 undefined。这些缺失的参数被视为“不存在”,规范算法可以按这种方式识别它们。在特定函数的描述中,术语“this value”和“NewTarget”具有 10.3 中给出的含义。
除非特定函数的描述中另有规定,如果向所描述的内置函数或构造函数提供的参数多于规定允许的数量,则调用会对额外参数求值,然后函数会忽略它们。不过,实现可以定义与这些参数相关的实现特定行为,只要该行为不是仅仅因为存在额外参数而抛出 TypeError 异常。
注 1
鼓励向内置函数集合添加额外能力的实现通过添加新函数来实现,而不是向现有函数添加新参数。
除非另有规定,每个内置函数和每个内置构造函数的 [[Prototype]] 内部槽值都是 Function 原型对象,即表达式 Function.prototype 的初始值(20.2.3)。
除非另有规定,每个内置原型对象的 [[Prototype]] 内部槽值都是 Object 原型对象,即表达式 Object.prototype 的初始值(20.1.3),Object 原型对象自身除外。
如果本规范通过算法步骤定义某个内置构造函数的行为,那么出于 [[Call]] 和 [[Construct]] 两种用途,该算法即为其行为。如果此类算法需要区分这两种情况,它会检查 NewTarget 是否为 undefined,这表示一次 [[Call]] 调用。
除非特定函数的描述中另有规定,未被标识为构造函数的内置函数对象不实现 [[Construct]] 内部方法。
除非特定函数的描述中另有规定,不是构造函数的内置函数对象不具有 "prototype" 属性。
本规范中定义的每个内置函数都是通过调用 CreateBuiltinFunction 抽象操作(10.3.4)创建的。length 和 name 参数的值是下文讨论的 "length" 和 "name" 属性的初始值。prefix 参数的值也在下文讨论。
每个内置函数对象(包括构造函数)都具有 "length" 属性,其值是非负整数 Number。除非另有规定,该值是函数描述子条款标题中显示的必需参数数量。可选参数和剩余参数不计入参数数量。
注 2
例如,Array 原型对象的 "map" 属性的初始值所对应的函数对象,在子条款标题 «Array.prototype.map (callback [ , thisArg])» 下描述,其中显示了两个具名参数 callback 和 thisArg,后者是可选参数;因此该函数对象的 "length" 属性值为 1𝔽。
除非另有规定,内置函数对象的 "length" 属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。
每个内置函数对象(包括构造函数)都具有 "name" 属性,其值是 String。除非另有规定,该值是本规范中赋予函数的名称。被标识为匿名函数的函数使用空 String 作为 "name" 属性的值。对于规定为对象属性的函数,名称值是用于访问该函数的属性名称字符串。规定为内置属性的 get 或 set 访问器函数的函数,在调用 CreateBuiltinFunction 时会将 "get" 或 "set"(分别)传给 prefix 参数。
对于属性键是 Symbol 值的每个内置函数,其 "name" 属性的值都会显式规定。如果此类显式规定的值以 "get " 或 "set " 前缀开头,并且所规定的函数是内置属性的 get 或 set 访问器函数,则去掉前缀后的值会传给 name 参数,而值 "get" 或 "set"(分别)会在调用 CreateBuiltinFunction 时传给 prefix 参数。
除非另有规定,内置函数对象的 "name" 属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。
除非另有规定,条款 19 到 28 以及附录 B.2 中描述的所有其他数据属性都具有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。
除非另有规定,条款 19 到 28 以及附录 B.2 中描述的每个访问器属性都具有特性 { [[Enumerable]]: false, [[Configurable]]: true }。如果只描述了 get 访问器函数,则 set 访问器函数为默认值 undefined。如果只描述了 set 访问器,则 get 访问器为默认值 undefined。