Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— ECMAScript 标准内置对象(不列出所有内置对象) #100

Open
lizhongzhen11 opened this issue Apr 23, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

ECMAScript 标准内置对象

夹杂着一些规范中用到的术语说明

  • 有没有想过 Function.length 为什么是1?

无论ECMAScript ScriptModule 何时开始执行,都有一些确定的内置对象可用。其中之一,全局对象 是执行程序 词法环境 的一部分。其它内置对象可以作为 全局对象 的初始化属性访问,也可以作为可访问的内置对象的属性间接访问。

除非另有说明,可作为函数调用的内置对象是具有 重学js —— 内置函数对象 中描述特征的内置 函数对象。除非另有说明,内置对象的 [[Extensible]] 内置插槽初始值为 true。每个内置 函数对象 都有 [[Realm]] 内置插槽其值是该对象初始化创建的 领域领域记录

许多内置对象是函数:可以传递参数调用它们。此外有一些对象是构造器:它们能被 new 操作符调用。每个内置函数,规范描述了该函数所需的参数以及该 函数对象 的属性。每个内置 构造器,规范还描述了该构造函数的原型对象的属性,以及使用 new 表达式调用该 构造器 返回的特定对象实例的属性。

除非另有说明,如果调用内置函数或 构造器 时传递少于该函数指定要求的参数,该函数或 构造器 的行为应与给足附加参数的行为完全相同,这些没有传递值过来的参数默认有 undefined 值。这些缺失的参数被认为 “不存在” 且可以通过规范算法识别。在特定函数的描述中,重学js —— 内置函数对象 中提到的 this valueNewTarget 含义相同。

除非另有说明,如果调用内置函数或 构造器 时传递多于该函数指定要求的参数,多余的参数在该函数调用求值时被忽略。但是,实现可以定义与此类参数有关的特定于实现的行为,只要该行为不引发 TypeError 异常,而该 TypeError 异常仅是根据是否存在额外的参数来确定的。

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

内置函数 原型

除非另有说明,每个内置函数和 构造器 都有函数原型对象,其为 Function.prototype 表达式的初始值,也作为该对象 [[Prototype]] 内置插槽的值。

除非另有说明,每个内置原型对象都有 Object 原型对象,其为 Object.prototype 表达式的初始值,也是该对象 [[Prototype]] 内置插槽的值,除了 Object原型对象本身

Object.prototype // 一个对象
Object.getPrototypeOf(Number.prototype) === Object.prototype // true
Object.getPrototypeOf(Function.prototype) === Object.prototype // true
Object.getPrototypeOf(Object.prototype) === Object.prototype // false
Object.getPrototypeOf(Object.prototype) // null

没有实现 [[Construct]] 内置方法的内置函数对象不会被识别为构造器,除非对特定函数另有说明。

规范中定义的每个内置 函数对象 都由调用 CreateBuiltinFunction 抽象操作创建。

内置函数 length

每个内置 函数对象,包括构造器,都有一个值为 整数length 属性。除非另有说明,该值默认等于函数显示的命名参数的最大数量。可选参数(规范中抽象方法使用 [] 括起来的参数)或剩余参数(规范中抽象方法使用 «...name» 形式的参数)不包含在默认的参数计数中。

注意:举个例子,Array 原型对象的 map 属性对应的 函数对象«Array.prototype.map (callbackFn [ , thisArg])» 子标题下描述,该子标题显示两个命名参数: callbackFnthisArgthisArg属于可选参数;因此该 函数对象 length 属性值为 1。

Array.prototype.map.length // 1

除非另有说明,内置 函数对象length 属性描述符为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }

内置函数 name

每个内置函数对象,包含构造器,都有值为字符串类型的 name 属性。除非另有说明,该属性值为规范赋予函数的名称。匿名函数 name 属性值为空字符串。对于指定为对象属性的函数,名称值是用于访问函数的 属性名称 字符串。被指定为内置属性的 getset 访问器的函数,其 namegetset 后的 属性名称。对于每个属性键为 Symbol 值的内置函数,将明确指定 name 属性的值。

除非另有说明,内置 函数对象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

@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Apr 23, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant