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