18 ECMAScript 标准内建对象 (ECMAScript Standard Built-in Objects)

当任意 ECMAScript ScriptModule 开始执行时,有若干内建对象可用。其中,全局对象是正在执行程序的全局环境的一部分。其他对象作为全局对象的初始属性或作为已可访问内建对象的属性间接访问。

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

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

除非在特定函数的描述中另有说明,如果给内建函数或构造器的实参少于其规范要求的数量,则该函数或构造器的行为与补足缺失的参数(每个缺失参数为 undefined)完全一致。此类缺失参数被视为 “not present”,规范算法可据此识别。在特定函数的描述中,“this value” 与 “NewTarget” 术语具有 10.3 中给出的含义。

除非在特定函数的描述中另有说明,如果调用所描述的内建函数或构造器时提供的参数多于其允许的数量,多余的参数会被求值但随后被函数忽略。但是,实现可针对这些参数定义实现特定行为,只要该行为不只是因为存在额外参数而抛出 TypeError 异常。

Note 1

为向内建函数集合添加额外能力的实现,鼓励通过添加新函数而非为现有函数增加新参数来实现。

除非另有说明,每个内建函数与每个内建构造器的 [[Prototype]] 内部槽值为 Function 原型对象,即表达式 Function.prototype20.2.3)的初始值。

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

若本规范通过算法步骤定义了某内建构造器的行为,则该行为同时适用于 [[Call]][[Construct]]。若该算法需要区分两种情形,它通过检测 NewTarget 是否为 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" 属性,其值为 String。除非另有说明,该值为本规范赋予该函数的名称。标识为匿名函数的使用空字符串作为 "name" 属性值。若函数作为对象的属性指定,其名称值为用于访问该函数的属性名字符串。作为内建属性的 getter 或 setter 访问器函数指定的函数,在调用 CreateBuiltinFunction 时分别将 "get""set" 传给 prefix 参数。

属性键为 Symbol 值的每个内建函数,其 "name" 属性值在规范中被明确指定。若该值以 "get ""set " 前缀开头且函数是某内建属性的 get 或 set 访问器,则去掉前缀的值传给 name 参数,而 "get""set"(分别)传给 prefix 参数。

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

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

1928 各小节以及附录 B.2 中描述的所有访问器属性,除非另有说明,具有属性特性 { [[Enumerable]]: false, [[Configurable]]: true }。若仅描述了 get 访问器函数,则 set 访问器函数为默认值 undefined。若仅描述了 set 访问器函数,则 get 访问器为默认值 undefined