17 ECMAScript标准内置对象

每当ECMAScript的Script或Module开始执行时,就有某些内置对象可用。第一个是全局对象,它是执行程序的词法环境的一部分。其他可以作为全局对象的初始属性访问,也可以作为可访问的内置对象的属性间接访问。

除非另有说明,否则可以作为函数调用的内置对象是具有9.3中描述的特征的内置函数对象。除非另有说明,否则内置对象的[[Extensible]]内部插槽最初的值为true。每个内置函数对象都有一个[[Realm]]内部插槽,其值是最初为其创建对象的作用域的作用域记录项。

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

除非在特定函数的说明中另有说明,否则,如果给内置函数或构造函数提供的参数少于指定给函数所需的参数,则该函数或构造函数的行为应与赋予了足够的附加参数完全相同,每个参数是undefined的值。这种丢失的参数被认为是“not present”,可以通过规范算法以这种方式进行识别。在特定功能的描述中,术语“this value”和“ NewTarget”具有9.3中给出的含义。

除非在特定功能的说明中另有说明,否则,如果为所描述的内置功能或构造函数提供的参数超出了指定功能所允许的范围,则多余的参数将由调用解析执行,然后由函数忽略。但是,实现可以定义与此类参数有关的实现特定的行为,只要该行为不是抛出TypeError异常(该异常仅基于存在额外的参数就可以得出)。

注1:鼓励为内置函数集添加其他功能的实现通过添加新功能而不是向现有功能添加新参数来实现。

除非另有说明,否则每个内置函数和每个内置构造函数均具有Function原型对象,该对象是表达式Function.prototype(19.2.3)的初始值,作为其[[Prototype]]内部插槽的值。

除非另有说明,否则每个内置原型对象都具有Object原型对象,该对象是表达式Object.prototype(19.1.3)的初始值,作为其[[Prototype]]内部插槽的值,但Object原型对象除外本身。

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

通过调用CreateBuiltinFunction抽象操作(9.3.3)创建此规范中定义的每个内置函数。

每个内置函数对象(包括构造函数)都有一个“length”属性,其值为整数。除非另有说明,否则该值等于该函数说明的子标题中显示的最大命名参数数量。可选参数(用方括号:[]表示)或其余参数(以«… name»形式显示)不包括在默认参数计数中。

注2:例如,在子标题«Array.prototype.map(callbackFn [,thisArg])»下描述了作为Array原型对象的map属性的初始值的函数对象,该函数对象显示了两个命名参数callbackFn和thisArg,后者是可选的;因此,该函数对象的“length”属性的值为1。

除非另有说明,否则内置函数对象的“ length”属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}。

没有被标识为匿名函数的每个内置函数对象(包括构造函数)都具有name属性,其值是String。除非另有说明,否则此值是在本规范中赋予函数的名称。对于指定为对象属性的函数,名称值是用于访问该函数的属性名称字符串。指定为内置属性的get或set访问器函数的函数的属性名称字符串前面带有“ get”或“ set”。name属性的值是为属性键为Symbol值的每个内置函数明确指定的

除非另有说明,否则内置函数对象的name属性(如果存在)具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}。

除非另有说明,否则第18至26条以及附件B.2中描述的所有其他数据属性均具有属性{[[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}。

除非另有说明,否则第18至26节以及附件B.2中描述的每个访问器属性都具有属性{[[Enumerable]]:false,[[Configurable]]:true}。如果仅描述了get访问器函数,则set访问器函数是默认值undefined。如果仅描述set访问器,则get访问器为默认值undefined。