0%

ECMA-262规范第6节中Language Types翻译

前面的文章—ECMA-262 规范第 4 节 Overview 翻译—翻译了 ECMA-262 规范的总览章节,下面翻译规范中第 6 节—ECMAScript Data Types and Values—的前半部分 Language Types,并对规范中的一些符号进行总结。

翻译

本规范中的算法处理每个具有相关类型的值。本节中定义了所有可能的值类型。类型进一步细分为 ECMAScript 语言类型和规范类型。

在本规范中,“Type(x)”符号看作“x 的类型”的简写,其中“Type”指的是在本节中定义的 ECMAScript 语言和规范类型。 当使用术语“empty”时,等同于说“no value of any type”。

语言类型

ECMAScript 语言类型对应于由 ECMAScript 程序员使用 ECMAScript 语言直接操作的值。 ECMAScript 语言类型为 Undefined、 Null、 Boolean、 String、 Symbol、 Number 和 Object。 一个 ECMAScript 语言的值是一个 ECMAScript 语言类型的拥有属性。

Undefined 类型

Undefined 类型只有一个名为 undefined 的值。 任何未赋值的变量值都为 undefined。

Null 类型

Null 类型只有一个值 null。

Boolean 类型

Boolean 类型表示具有两个值(true 和 false)的逻辑实体。

String 类型

String 类型是所有由零个或多个 16 位无符号整数值(“elements”)组成的有序序列的集合,最大长度为 253-1 个元素。 String 类型通常用于表示正在运行的 ECMAScript 程序中的文本数据,在这种情况下,String 中的每个元素都被视为 UTF-16 码元值。 每个元素被在序列中占据一个位置。 这些位置用非负整数进行索引。 第一个元素(如果存在)位于索引 0,下一个元素(如果存在)位于索引 1,依此类推。 String 的长度是其中元素的数量(即 16 位值)。 空 String 的长度为零,因此不包含任何元素。

不解释 String 内容的 ECMAScript 操作不应用进一步的语义。 解释 String 值的操作将每个元素视为单个 UTF-16 码元。 然而,ECMAScript 并不限制这些码元的值或这些码元之间的关系,因此进一步将 String 内容解释为 UTF-16 编码的 Unicode 代码点序列的操作必须考虑到形式不良的子序列。 这些操作对包含数值在 0xD800 到 0xDBFF 范围内的每个码元(Unicode 标准将其定义为主要代理,或更正式地定义为高代理码元)和包含数值在 0xDC00 到 0xDFFF 范围内的每个代码单元(定义为尾随代理项,或更正式地称为低代理项码元)使用以下规则进行特殊处理:

  • 不是高代理项和低代理项的代码单元被解释为具有相同值的代码点。
  • 一个由两个代码单元组成的序列,其中第一个代码单元 c1 是高代理,第二个代码单元 c2 是低代理,它是一个代理对,并被解释为一个值为(c1-0xD800)0x400 + (c2-0xDC00) + 0x10000 的代码点。 (见 10.1.2)
  • 作为高代理或低代理,但不是代理对的一部分的代码单元,被解释为具有相同值的代码点。

String.prototype.normalize (参见 21.1.3.12)可用于显式规范化 String 值。String.prototype.localeCompare(参见 21.1.3.10)内部规范字符串值,但是没有其他操作隐式规范所操作的字符串。 只有明确指定为语言或部分敏感的操作才会产生对语言敏感的结果。

注意:这种设计背后的基本原理是保证 Strings 的实现尽可能简单和高性能。 如果 ECMAScript 源文本采用规范化表单 C,那么字符串文本也肯定会被规范化(只要它们不包含任何 Unicode 转义序列)。

在本规范中,短语“the string-concatenation of A, B, …”(其中每个参数是一个 String 值、一个代码单元或一个代码单元序列)表示 String 值,其代码单元序列是每个参数的代码单元的串联(按顺序)。。

Symbol 类型

Symbol 类型是可用作 Object 属性(6.1.7)的键的所有非 String 值的集合。

每个 Symbol 值都是唯一的和不可变的。

每个 Symbol 值不可变地保存一个名为[[ Description ]]的关联值,该值要么是 undefined,要么是 String 值。

Well-Known Symbols

Well-known symbols 是本规范的算法显式引用的内置 Symbol 值。它们通常用作属性的键,这些属性的值充当规范算法的扩展点。 除非另有说明,否则所有范围(8.2)都共享 Well-known symbols 值。

Within this specification a well-known symbol is referred to by using a notation of the form @@name, where “name” is one of the values listed in Table 1.

在本规范中,使用@@name形式的符号来引用一个 Well-known symbols,其中“name”是表 1 中列出的值之一。

表 1: Well-known Symbols
规范名称 [[Description]] 值和作用
@@asyncIterator "Symbol.asyncIterator" 方法,返回对象的默认 AsyncIterator 。由 for-await-of 语句的语义调用。
@@hasInstance "Symbol.hasInstance" 方法,用于确定构造函数是否将对象识别为自身实例之一。 由 instanceof 运算符的语义调用。
@@isConcatSpreadable "Symbol.isConcatSpreadable" Boolean 值属性,如果为 true,则表示对象应该通过 Array.prototype.concat 将其展平为数组元素。
@@iterator "Symbol.iterator" 方法,返回对象的默认迭代器。由 for-of 语句的语义调用。
@@match "Symbol.match" 方法,匹配正则表达式与字符串,由 String.prototype.match 方法调用。
@@replace "Symbol.replace" 方法,替换字符串中与正则表达式匹配的子字符串。由 String.prototype.replace 方法调用。
@@search "Symbol.search" 方法,返回与正则表达式匹配的字符串中的索引。 由 String.prototype.search 方法调用。
@@species "Symbol.species" 函数值属性,是用于创建派生对象的构造函数。
@@split "Symbol.split" 正则表达式方法,在与正则表达式匹配的索引处拆分字符串。 由 String.prototype.split 方法调用。
@@toPrimitive "Symbol.toPrimitive" 方法,将对象转换为对应基本值。由 ToPrimitive 抽象操作调用。
@@toStringTag "Symbol.toStringTag" String 值属性,用于创建对象的默认字符串说明 。 通过内置方法 Object.prototype.toString 访问。
@@unscopables "Symbol.unscopables" 一个 Object 值属性,其自身和继承的属性名称是从关联对象的 with 环境绑定中排除的属性名称。

Number 类型

Number 类型有 18437736874454810627 个值(即 2^64-2^53 + 3) ,表示 IEEE 754-2008 中 二进制浮点运算标准中指定的双精度 64 位格式值,去除了 IEEE 标准中的 9007199254740990 个“Not-a-Number”值,这些值在 ECMAScript 中表示为一个特殊的 NaN 值。 (注意,NaN 值是由程序表达式 NaN 生成的) 在一些实现中,外部代码可能能够检测不同 Not-a-Number 值之间的差异,但是这种行为依赖于如何实现; 对于 ECMAScript 代码,所有 NaN 值彼此之间是无法区分的。

注意:存储 Number 值后在 ArrayBuffer (参见 24.1)或 SharedArrayBuffer (参见 24.2)中可能观察到的位模式不一定与 ECMAScript 实现使用的 Number 值的内部表示相同。

还有另外两个特殊的值,称为正无穷大和负无穷大。 为了简洁起见,这些值也分别用 + ∞ 和-∞ 来说明。 (注意,这两个无限数值是由表达式 + Infinity (或 Infinity)和-Infinity 产生的。)

另外 18437736874454810624 个(即 2^64-2^53)值称为有限数。 其中一半是正数,一半是负数; 对于每一个有限的正数值,都有一个具有相同大小的对应负值。

请注意,这里有一个正零和一个负零。 为了简洁起见,这些值也分别用 + 0 和-0 来说明。 (注意,这两个不同的零数值是由程序表达式 + 0(或简称 0)和-0 产生的。)

18437736874454810622(即 2^64-2^53-2)有限非零值有两种:

18428729675200069632(即 2^64-2^54)被规范化,具有如下格式:

s × m × 2 ^ e

s 是 + 1 或-1,m 是小于 2^53 但不小于 2^52 的正整数,e 是从-1074 到 971 的整数。

其余的 9007199254740990 个(即 2^53-2)值是非规范化的,具有如下格式:

s × m × 2 ^e

S 是 + 1 或者-1 m 是小于 2^52 的正整数 ,e 是-1074。

请注意,所有大小不大于 2^53 的正整数和负整数都可以用 Number 类型表示(实际上,整数 0 有两个表示,+ 0 和-0)。

有限数有奇数的意义,如果它是非零的,表示它的整数 m (在上面所示的两种形式之一)是奇数。 除此之外,它还有一个更为重要的意义。

在本规范中,短语“the Number value for x” ,其中 x 表示一个精确的真实数学量(甚至可能是一个无理数,如 π) ,表示按以下方式选择的数值。 考虑数字类型的所有有限值的集合,去掉 -0,再加上两个在数字类型中不能表示的额外值,即 2^1024(+ 1×2^53×2^971)和 -2^1024(- 1×2^53×2^971)。 选择该集合中值最接近 x 的成员。 如果集合中的两个值相等接近,则选择具有偶数意义的一个; 为此,2^1024 和 -2^1024 这两个额外值被认为具有偶数意义。 最后,如果选择了 2^1024,将其替换为 + ∞ ; 如果选择了-2^1024,将其替换为-∞ ; 如果选择了 + 0,当且仅当 x 小于零时,将其替换为-0; 任何其他选择的值将不变地使用。 结果是 x 的 Number 值(此过程完全符合 IEEE 754-2008“四舍五入到最近的,约束到偶数”模式的行为)。

有些 ECMAScript 运算符只处理特定范围内的整数,比如 -2^31 到 2^31-1,或者从 0 到 2^16-1。 这些运算符接受 Number 类型的任何值,但首先将每个值转换为预期范围内的整数值。 请参阅 7.1 中对数值转换操作的描述。

Object 类型

一个 Object 在逻辑上是属性的集合。每个属性要么是数据属性,要么是访问器属性:

  • 数据属性将键值与 ECMAScript 语言值和一组 Boolean 属性关联。
  • 访问器属性将键值与 1 个或 2 个访问器函数以及一组布尔属性关联。 访问器函数用于存储或检索与属性关联的 ECMAScript 语言值。

属性使用键值对进行标识。 属性键值对可以是 ECMAScript String 值,也可以是 Symbol 值。 所有 String 和 Symbol 值(包括空字符串)都作为属性键都有效。 属性名称是一个属性键,它是一个 String 值。

整数索引是一个 String 值属性键,它是一个规范的数值 String (参见 7.1.16) ,其数值可以是 + 0 或者是一个 ≤2^53-1 的正整数。 数组索引是一个整数索引,其数值 i 在 + 0≤ i<2^32-1 范围内。

属性键用于访问属性及其值。 对于属性有两种访问方式: get 和 set,分别对应于值检索和赋值。 通过 get 和 set 访问的属性既包括作为对象直接部分的属性,也包括由另一个关联对象通过属性继承关系提供的继承属性。 继承的属性可以是关联对象的自有属性,也可以是继承的属性。 对象的每个属性都必须有一个键值,这个键值与对象的其他属性的键值不同。

所有对象在逻辑上都是属性的集合,但是存在多种形式的对象,这些对象的语义不同,因此不能访问和操作它们的属性。 Ordinary object 是对象最常见的形式,具有默认的对象语义。 Exotic object 是任意形式的对象,其属性语义在任何情况下与默认语义都不同。

Property Attributes

attributes 在本规范中用于定义和解释对象 property 的状态。 数据 property 将键值与表 2 中列出的 attributes 关联起来。

表 2: 数据 property 的 attributes
Attribute Name Value Domain Description
[[Value]] Any ECMAScript language type 通过 value 访问 property 值。
[[Writable]] Boolean 如果为 false,则 ECMAScript 代码使用[[Set ]]更改 property 的[[Value]] attribute 的尝试将不会成功。
[[Enumerable]] Boolean 如果为 true,则该属性可通过 for-in 进行枚举。 否则,该属性被不可枚举。
[[Configurable]] Boolean 如果为 false,则尝试删除 property、将 property 更改为访问器 property 或更改 property 的 attribute(除了[[Value]] ,或将[[Writable]]更改为 false)将失败。

访问器 property 将键值与表 3 中列出的 attributes 关联。

表 3: 访问器property的attributes
Attribute Name Value Domain Description
[[Get]] Object | Undefined 如果值是一个对象,那么它必须是一个函数对象。 函数的[[Call]]内部方法(表 6)使用一个空参数列表调用,以便在每次执行对属性的 get 访问时检索属性值。
[[Set]] Object | Undefined 如果值是一个对象,那么它必须是一个函数对象。 调用函数的[[Call]]内部方法(表 6)时,每次执行属性的访问时,都使用一个参数列表,其中包含分配的值作为其唯一的参数。 属性的[[[Set]]内部方法的效果可能会影响随后调用属性的[[Get]]内部方法所返回的值,但并不需要这样做。
[[Enumerable]] Boolean 如果为 true,则该属性可通过 for-in 进行枚举。 否则,该属性被不可枚举。
[[Configurable]] Boolean 如果为 false,则尝试删除 property、将属性更改为数据 property 或更改其 property 将失败。

如果本规范未显式指定 property 的 attributes 初始值,则使用表 4 中定义的默认值。

表4: 默认attribute值
Attribute Name Default Value
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false
对象的内部方法和内部插槽

在 ECMAScript 中,对象的实际语义是通过称为内部方法的算法指定的。 ECMAScript 引擎中的每个对象都与一组定义其运行时表现的内部方法相关联。 这些内部方法不是 ECMAScript 语言的一部分。 在本规范中,它们的定义完全是为了说明性的目的。 但是,ECMAScript 实现中的每个对象必须按照与其关联的内部方法的指定来表现。 实现此目标的确切方式取决于如何实现。

内部方法名称有多种形态。 这意味着不同的对象值在调用相同的内部方法名称时可能执行不同的算法。 调用内部方法的实际对象是调用的“target”。 如果在运行时,算法的实现试图使用对象不支持的内部方法,则会引抛出 TypeError 异常。

内部插槽对应于与关联对象的内部状态,并由各种 ECMAScript 规范算法使用。 内部插槽不是对象的属性,也不可继承。 根据特定的内部插槽规范,这种状态可能由任何 ECMAScript 语言类型的值或特定的 ECMAScript 规范类型值组成。 除非另有明确指定,否则内部插槽是在创建对象过程中分配的,不能动态地添加到对象中。 除非另有说明,否则内部插槽的初始值是 undefined。 本规范中的各种算法创建具有内部插槽的对象。 但是,ECMAScript 语言没有提供将内部插槽与对象关联的直接方法。

内部方法和内部插槽在本规范中使用双方括号[[ ]]内的 name 来标识。

表 5 总结了本规范使用的基本内部方法,这些方法适用于由 ECMAScript 代码创建或操作的所有对象。 每个对象都必须有适用于所有基本内部方法的算法。 但是,对于这些方法,所有对象并不一定使用相同的算法。

表 5 和其他类似表的“Signature”列描述了每个内部方法的调用模式。 调用模式总是包含一个带括号的描述性参数名列表。 如果参数名称与 ECMAScript 类型名称相同,则参数名称描述的是参数值所需的类型。 如果内部方法显式的返回值,则其参数列表后跟符号“→”和返回值的类型名称。 Signature 中使用的类型名称是指第 6 条中定义的类型,该类型由以下附加名称进行扩充。 “ any”表示该值可以是任何 ECMAScript 语言类型。 内部方法隐式返回 Completion Record。 除了参数之外,内部方法总是可以访问作为方法调用 target 的对象。

表5: 基本内部方法
Internal Method Signature Description
[[GetPrototypeOf]] ( ) Object | Null 获取为此对象提供继承属性的对象。null 没有继承属性。
[[SetPrototypeOf]] (Object | Null) Boolean 将此对象与另一个提供继承属性的对象关联。 传递 null 表示没有继承的属性。 返回 true,指示操作已成功完成,或返回 false,指示操作未成功。
[[IsExtensible]] ( ) Boolean 确定是否允许向此对象添加其他属性
[[PreventExtensions]] ( ) Boolean 控制是否可以向此对象添加新属性。 如果操作成功,返回 true; 如果操作不成功,返回 false。
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor 返回此对象的属性键为 propertyKey 的属性描述符,如果不存在此属性,则返回 undefined。
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) Boolean 创建或更改自己的键为 propertyKey 属性,使该属性状态按照 PropertyDescriptor 描述。 如果该属性已成功创建 / 更新,则返回 true; 如果无法创建或更新该属性,则返回 false。
[[HasProperty]] (propertyKey) Boolean 返回一个 Boolean 值,该值指示此对象是否已经具有键为 propertyKey 的自有属性或继承属性。
[[Get]] (propertyKey, Receiver) any 从此对象返回其键为 propertyKey 的属性的值。 如果必须执行任何 ECMAScript 代码来检索属性值,则在计算代码时使用 Receiver 作为 this 值。
[[Set]] (propertyKey, value, Receiver) Boolean 如果必须执行任何 ECMAScript 代码来设置属性值,则在计算代码时使用 Receiver 作为 this 值。 如果属性值设置成功,则返回 true; 如果设置失败,则返回 false。
[[Delete]] (propertyKey) Boolean 从此对象中删除键为 propertyKey 的属性。 如果属性没有被删除并且仍然存在,则返回 false。 如果属性被删除或不存在,则返回 true。
[[OwnPropertyKeys]] ( ) List of propertyKey 返回一个 List,其元素都是对象自己的属性键。
表6: 函数对象附加的基本内部方法
Internal Method Signature Description
[[Call]] (any, a List of any) any 执行与此对象关联的代码。 通过函数调用表达式调用。 内部方法的参数是一个 this 值和一个包含传递给函数的参数的列表。 实现此内部方法的对象必须是可调用的。
[[Construct]] (a List of any, Object) Object 创建一个对象。 通过 new 或 super 运算符调用。 此内部方法的第一个参数是一个包含运算符参数的列表。 第二个参数是最初应用 new 运算符的对象。 实现此内部方法的对象称为构造函数。 函数对象不一定是构造函数,非构造函数的函数对象没有[[Construct]]内部方法。

ordinary objects 和标准 exotic objects 的基本内部方法的语义在第 9 条中有详细说明。如果某个实现不支持对 exotic objects 的内部方法的某指定使用,则该使用必须在尝试时抛出 TypeError 异常。

基本内部方法的不变量

ECMAScript 引擎的内部对象方法必须符合下面指定的不变量列表。 普通的 ECMAScript 对象以及本规范中的所有标准 exotic objects 都维护这些不变量。 ECMAScript Proxy 对象通过在运行时检查[[ ProxyHandler]]对象上调用的 trap 的结果来维护这些不变量。

实现时必须为这些 exotic objects 维护这些不变量。 违反这些不变量可能会导致 ECMAScript 代码具有不可预测的行为并产生安全问题。 但是,违反这些不变量决不能危及实现时的内存安全。

实现时决不能允许以任何方式规避这些不变量,例如提供替代接口来实现基本内部方法的功能,而不强制使用不变量。

定义:
  • 内部方法的 target 是调用内部方法的对象。
  • 如果观察到 target 从其[[[IsExtensible]]]内部方法返回 false,或从其[[ PreventExtensions ]]内部方法返回 true,则该目标是不可扩展的。
  • 不存在的属性不是非可扩展 target 上的属性。
  • 所有对 SameValue 的引用都依据 SameValue 算法的定义。
[[GetPrototypeOf]]()
  • 返回值的类型必须是 Object 或 Null。
  • 如果 target 是不可扩展的,并且[[GetPrototypeOf]]返回一个值 V,那么将来对[[GetPrototypeOf]]的任何调用都应该将 SameValue 作为 V 返回。

注意 1:一个对象的原型链应该有有限的长度(也就是说,从任何对象开始,递归地应用[[GetPrototypeOf]]内部方法到它的结果最终应该导致值 null)。 但是,如果原型链包含任何 exotic objects(该对象不使用 ordinary object 的[[GetPrototypeOf]]定义),那么这个要求作为对象级别的不变量并不是强制的。 这样的循环原型链在访问对象属性时可能导致无限循环。

[[SetPrototypeOf]](V)
  • 返回值的类型必须是 Boolean 值。
  • 如果 target 是不可扩展的,[[SetPrototypeOf]]必须返回 false,除非 V 是 target 所观察到的[[GetPrototypeOf]]值的 SameValue。
[[IsExtensible]]()
  • 返回值的类型必须是 Boolean 值。
  • 如果[[ IsExtensible ]]返回 false,那么将来对 target 的所有[[IsExtensible]]调用都必须返回 false。
[[PreventExtensions]]()
  • 返回值的类型必须是 Boolean 值。
  • 如果[[PreventExtensions]]返回 true,那么将来对目标的所有[[IsExtensible]]调用都必须返回 false,并且 target 现在被认为是不可扩展的。
[[GetOwnProperty]](P)
  • 返回值的类型必须是 属性描述符 或 Undefined.
  • 如果返回值的类型为属性描述符 ,则返回值必须是完整的属性描述符。
  • 如果将 P 描述为一个不可配置、不可写的自己的数据属性,那么对[[GetOwnProperty]](P)的所有未来调用都必须返回属性描述符,它的[[Value]]是作为 P 的[[Value]]属性的 SameValue。
  • 如果 P 的[[Writable]]以外的其他属性可能随时间变化,或者属性可能被删除,那么 P 的[[Configurable]]属性必须为 true。
  • 如果[[Writable]]属性可能从 false 更改为 true,那么[[Configurable]]属性必须为 true。
  • 如果 target 是不可扩展的且 P 不存在,那么将来对 target 上的[[GetOwnProperty]](P)的所有调用都必须将 P 描述为不存在的(即[[ GetOwnProperty ]](P)必须返回 undefined)。

注意 2:作为第三个不变量的结果,如果一个属性被描述为一个数据属性,并且随着时间的推移它可能返回不同的值,那么[[ Writable ]]和[[ Configurable ]]属性中的一个或两个必须为 true,即使没有通过其他内部方法公开更改值的机制。

[[DefineOwnProperty]] ( P, Desc )
  • 返回值的类型必须是 Boolean 值。
  • 如果先前观察到 P 是 target 的一个不可配置的属性,[[DefineOwnProperty]]必须返回 false,除非:
    1. P 是一个可写数据属性。 可将不可配置的可写数据属性更改为不可配置不可写数据属性。
    2. Desc 的所有属性都是作为 P 属性的 SameValue。
  • 如果 target 是不可扩展的并且 P 是一个不存在的属性,那么[[ DefineOwnProperty ]](P,Desc)必须返回 false。 也就是说,不可扩展的目标对象不能使用新属性进行扩展。
[[HasProperty]](P)
  • 返回值的类型必须是 Boolean 值。
  • 如果以前观察到 P 是 target 的不可配置的自身的数据或访问器属性,那么[[ HasProperty]]必须返回 true。
[[Get]] ( P, Receiver )
  • 如果以前观察到 P 是 target 的不可配置、不可写的数据属性,值为 V,那么[[Get]]必须将 返回为 v 的 SameValue 。
  • 如果以前观察到 P 是 target 的不可配置的自身的访问器属性,其[[ Get ]]]属性是 undefined,则[[ Get ]]操作必须返回 undefined。
[[Set]] ( P, V, Receiver )
  • 返回值的类型必须是 Boolean 值。
  • 如果以前观察到 P 是 target 的不可配置的、不可写的数据属性,那么[[ Set ]]必须返回 false,除非 v 是作为 P 的[[ Value ]]属性的 SameValue。
  • 如果以前观察到 P 是 target 的不可配置的自身的访问器属性,并且[[ Set ]]属性是 undefined,那么[[Set]]操作必须返回 false。
[[Delete]](P)
  • 返回值的类型必须是 Boolean 值。
  • 如果以前观察到 P 是 target 的不可配置的自身数据或访问器属性,那么[[Delete]]必须返回 false。
[[OwnPropertyKeys]]()
  • 返回值必须是一个 List。
  • 返回的 List 不能包含任何重复项。
  • 返回的 List 的每个元素的类型为 String 或 Symbol。
  • 返回的 List 必须至少包含以前观察到的所有不可配置属性的键。
  • 如果对象是不可扩展的,则返回的 List 必须只包含使用[[GetOwnProperty]]可观察到的对象的所有属性的键。
[[Construct]]()
  • 返回值的类型必须是 Object。
Well-Known 内部对象

well-known 内部对象是本规范的算法显式引用的内置对象,它们通常具有特定作用域的标识。 除非另有说明,否则每个内部对象实际上对应于一组相似的对象(每个作用域一个)。

在此规范中,引用如%name% 表示与当前作用域关联的对应于该名称内部对象。 当前作用域及其内部对象的确定在 8.3 中描述。 well-known 内部对象列在表 7 中。

表7: Well-Known 内部对象
Intrinsic Name Global Name ECMAScript Language Association
%Array% Array Array 类型的构造函数
%ArrayBuffer% ArrayBuffer ArrayBuffer 类型的构造函数
%ArrayBufferPrototype% ArrayBuffer.prototype %ArrayBuffer%的 prototype 属性的初始值。
%ArrayIteratorPrototype% Array 迭代器对象的原型
%ArrayPrototype% Array.prototype %Array%的 prototype 属性的初始值。
%ArrayProto_entries% Array.prototype.entries %ArrayPrototype%的 entries 属性的初始值。
%ArrayProto_forEach% Array.prototype.forEach %ArrayPrototype%的 forEach 属性的初始值。
%ArrayProto_keys% Array.prototype.keys %ArrayPrototype%的 keys 属性的初始值。
%ArrayProto_values% Array.prototype.values %ArrayPrototype%的 values 属性的初始值。
%AsyncFromSyncIteratorPrototype% Async-from-sync 迭代器对象的原型。
%AsyncFunction% Async 函数对象的构造函数
%AsyncFunctionPrototype% %AsyncFunction%的 prototype 属性的初始值。
%AsyncGenerator% %AsyncGeneratorFunction%的 prototype 属性的初始值。
%AsyncGeneratorFunction% async 迭代器对象的构造函数。
%AsyncGeneratorPrototype% %AsyncGenerator%的 prototype 属性的初始值。
%AsyncIteratorPrototype% 所有标准的内置 async 迭代器对象都间接继承的对象
%Atomics% Atomics Atomics 对象
%Boolean% Boolean Boolean 的构造函数
%BooleanPrototype% Boolean.prototype %Boolean%的 prototype 属性的初始值。
%DataView% DataView DataView 的构造函数
%DataViewPrototype% `DataView.prototype %DataView%的 prototype 属性的初始值。
%Date% Date Date 的构造函数
%DatePrototype% Date.prototype %Date%的 prototype 属性的初始值。
%decodeURI% decodeURI decodeURIh 函数
%decodeURIComponent% decodeURIComponent decodeURIComponent 函数
%encodeURI% encodeURI encodeURI 函数
%encodeURIComponent% encodeURIComponent encodeURIComponent 函数
%Error% Error Error 的构造函数
%ErrorPrototype% Error.prototype %Error%的 prototype 属性的初始值。
%eval% eval eval 函数
%EvalError% EvalError EvalError 的构造函数
%EvalErrorPrototype% `EvalError.prototype %EvalError%的 prototype 属性的初始值。
%Float32Array% Float32Array Float32Array 的构造函数
%Float32ArrayPrototype% `Float32Array.prototype %Float32Array%的 prototype 属性的初始值。
%Float64Array% Float64Array Float64Array 的构造函数
%Float64ArrayPrototype% Float64Array.prototype %Float64Array%的 prototype 属性的初始值。
%Function% Function Function 的构造函数
%FunctionPrototype% Function.prototype %Function%的 prototype 属性的初始值。
%Generator% %GeneratorFunction%的 prototype 属性的初始值。
%GeneratorFunction% Generator 对象的构造函数
%GeneratorPrototype% %Generator%的 prototype 属性的初始值。
%Int8Array% Int8Array 的构造函数
%Int8ArrayPrototype% Int8Array.prototype %Int8Array%的 prototype 属性的初始值。
%Int16Array% Int16Array Int16Array 的构造函数
%Int16ArrayPrototype% Int16Array.prototype %Int16Array%的 prototype 属性的初始值。
%Int32Array% Int32Array Int32Array 的构造函数
%Int32ArrayPrototype% Int32Array.prototype %Int32Array%的 prototype 属性的初始值。
%isFinite% isFinite isFinite 函数
%isNaN% isNaN isNaN 函数
%IteratorPrototype% 所有标准内置迭代器对象间接继承来源的对象
%JSON% JSON JSON 对象
%JSONParse% JSON.parse %JSON%的 parse 属性的初始值。
%JSONStringify% JSON.stringify %JSON%的 stringfy 属性的初始值。
%Map% Map Map 的构造函数
%MapIteratorPrototype% Map 迭代器对象的 prototype
%MapPrototype% Map.prototype %Map%的 prototype 属性的初始值。
%Math% Math Math 对象
%Number% Number Number 的构造函数
%NumberPrototype% Number.prototype %Number%的 prototype 属性的初始值。
%Object% Object Object 的构造函数
%ObjectPrototype% Object.prototype %Object%的 prototype 属性的初始值。
%ObjProto_toString% Object.prototype.toString %ObjectPrototype%的 toString 属性的初始值。
%ObjProto_valueOf% Object.prototype.valueOf %ObjectPrototype%的 valueOf 属性的初始值。
%parseFloat% parseFloat parseFloat 函数
%parseInt% parseInt parseInt 函数
%Promise% Promise Promise 的构造函数
%PromisePrototype% Promise.prototype %Promise%的 prototype 属性的初始值。
%PromiseProto_then% Promise.prototype.then %PromisePrototype%的 then 属性的初始值。
%Promise_all% Promise.all %Promise%的 all 属性的初始值。
%Promise_reject% Promise.reject %Promise%的 reject 属性的初始值。
%Promise_resolve% Promise.resolve %Promise%的 resolve 属性的初始值。
%Proxy% Proxy Proxy 的构造函数
%RangeError% RangeError RangeError 的构造函数
%RangeErrorPrototype% RangeError.prototype %RangeError%的 prototype 属性的初始值。
%ReferenceError% ReferenceError ReferenceError 的构造函数
%ReferenceErrorPrototype% ReferenceError.prototype %ReferenceError%的 prototype 属性的初始值。
%Reflect% Reflect Reflect 对象
%RegExp% RegExp RegExp 的构造函数
%RegExpPrototype% RegExp.prototype %RegExp%的 prototype 属性的初始值。
%Set% Set Set 的构造函数
%SetIteratorPrototype% Set 迭代器对象的 prototype 属性
%SetPrototype% Set.prototype %Set%的 prototype 属性的初始值。
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer 的构造函数
%SharedArrayBufferPrototype% SharedArrayBuffer.prototype %SharedArrayBuffer%的 prototype 属性的初始值。
%String% String String 的构造函数
%StringIteratorPrototype% String 迭代器对象的 prototype
%StringPrototype% String.prototype %String%的 prototype 属性的初始值。
%Symbol% Symbol Symbol 的构造函数
%SymbolPrototype% Symbol.prototype %Symbol%的 prototype 属性的初始值。
%SyntaxError% SyntaxError SyntaxError 的构造函数
%SyntaxErrorPrototype% SyntaxError.prototype %SyntaxError%的 prototype 属性的初始值。
%ThrowTypeError% 无条件抛出%TypeError%新实例的函数对象
%TypedArray% 所有类型化 Array 构造函数的 super 类
%TypedArrayPrototype% %TypedArray%的 prototype 属性的初始值。
%TypeError% TypeError TypeError 的构造函数
%TypeErrorPrototype% TypeError.prototype %TypeError%的 prototype 属性的初始值。
%Uint8Array% Uint8Array Uint8Array 的构造函数
%Uint8ArrayPrototype% Uint8Array.prototype %Uint8Array%的 prototype 属性的初始值。
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray 的构造函数
%Uint8ClampedArrayPrototype% Uint8ClampedArray.prototype %Uint8ClampedArray%的 prototype 属性的初始值。
%Uint16Array% Uint16Array Uint16Array 的构造函数
%Uint16ArrayPrototype% Uint16Array.prototype %Uint16Array%的 prototype 属性的初始值。
%Uint32Array% Uint32Array Uint32Array 的构造函数
%Uint32ArrayPrototype% Uint32Array.prototype %Uint32Array%的 prototype 属性的初始值。
%URIError% URIError URIError 的构造函数
%URIErrorPrototype% URIError.prototype %URIError%的 prototype 属性的初始值。
%WeakMap% WeakMap WeakMap 的构造函数
%WeakMapPrototype% WeakMap.prototype %WeakMap%的 prototype 属性的初始值。
%WeakSet% WeakSet WeakSet 的构造函数
%WeakSetPrototype% WeakSet.prototype %WeakSet%的 prototype 属性的初始值。

总结

列举一些规范中除文法外符号含义:

  • @@name:well-known symbol

  • [[name]]:内部方法和内部插槽

  • %name%:当前作用域的内部对象

  • Type(x):x 的类型

  • « element1, element2 »:List

  • PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }:用类似对象的方式描述 attribute

👆 全文结束,棒槌时间到 👇