18 ECMAScript 标准内建对象

在任何 ECMAScript ScriptModule 开始执行时,都存在某些内建对象。其中之一是全局对象,它是执行程序的全局环境的一部分。其他对象可以作为全局对象的初始属性访问,或作为可访问的内建对象的属性间接访问。

除非另有说明,可作为函数调用的内建对象都是具有 10.3 中描述特性的内建函数对象。除非另有说明,内建对象的 [[Extensible]] 内部槽初始值为 true。每个内建函数对象都有一个 [[Realm]] 内部槽,其值为创建该对象时所属的 Realm Record

许多内建对象是函数:它们可以带参数调用。其中一些还是构造函数:它们是用于与 new 运算符一起使用的函数。对于每个内建函数,本规范描述了该函数所需的参数以及该函数对象的属性。对于每个内建构造函数,本规范还描述了该构造函数的原型对象的属性,以及通过 new 表达式调用该构造函数所返回的具体对象实例的属性。

除非在特定函数的描述中另有说明,如果内建函数或构造函数接收到的参数少于其规定所需的参数,则其行为应与接收到足够数量的额外参数完全相同,每个额外参数的值均为 undefined。这些缺失参数被视为“未提供”,规范算法可以以此方式识别。在特定函数的描述中,“this 值”和“NewTarget”术语的含义见 10.3

除非在特定函数的描述中另有说明,如果内建函数或构造函数接收到的参数多于其允许的数量,则这些额外参数会被调用过程求值,但随后被函数忽略。不过,只要行为不是仅因为存在额外参数而抛出 TypeError 异常,实现可以定义与这些参数相关的特定实现行为。

Note 1

鼓励实现通过添加新函数来扩展内建函数集合,而不是向现有函数添加新参数。

除非另有说明,每个内建函数和内建构造函数的 [[Prototype]] 内部槽值都是函数原型对象,即表达式 Function.prototype 的初始值(20.2.3)。

除非另有说明,每个内建原型对象的 [[Prototype]] 内部槽值都是对象原型对象,即表达式 Object.prototype 的初始值(20.1.3),但对象原型对象本身除外。

如果本规范通过算法步骤定义了某个内建构造函数的行为,则该行为同时适用于 [[Call]][[Construct]]。如果需要区分这两种情况,则通过检查 NewTarget 是否为 undefined 来实现,若为 undefined 则表示 [[Call]] 调用。

未被标识为构造函数的内建函数对象不实现 [[Construct]] 内部方法,除非在特定函数的描述中另有说明。

未被标识为构造函数的内建函数对象没有 "prototype" 属性,除非在特定函数的描述中另有说明。

本规范中定义的每个内建函数都是通过调用 CreateBuiltinFunction 抽象操作创建的(10.3.4)。参数 lengthname 的值分别是 "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" 属性,其值为字符串。除非另有说明,该值为本规范中赋予该函数的名称。被标识为匿名函数的函数使用空字符串作为 "name" 属性的值。对于被指定为对象属性的函数,其名称值为用于访问该函数的属性名字符串。对于作为内建属性的 getter 或 setter 访问器函数,其在调用 CreateBuiltinFunction 时会将 "get""set"(分别)传递给参数 prefix

对于其属性键为 Symbol 值的内建函数,其 "name" 属性的值会被显式指定。如果该值以前缀 "get ""set " 开头,并且该函数是某个内建属性的 getter 或 setter 访问器函数,则去掉前缀后的值传递给参数 name,而 "get""set"(分别)传递给参数 prefix,用于调用 CreateBuiltinFunction

除非另有说明,内建函数对象"name" 属性具有 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 特性。

在条款 1928 以及附录 B.2 中描述的所有其他数据属性,除非另有说明,其特性为 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。

在条款 1928 以及附录 B.2 中描述的所有访问器属性,除非另有说明,其特性为 { [[Enumerable]]: false, [[Configurable]]: true }。如果仅描述了 getter 访问器函数,则 setter 访问器函数的默认值为 undefined。如果仅描述了 setter 访问器,则 getter 访问器的默认值为 undefined