?uem/p1-90`本规范中的算法操作各种值,每个值都有一个关联的类型。可能的值类型恰好就是本条款中定义的那些类型。类型进一步分为
ECMAScript 语言类型对应于 ECMAScript 程序员使用 ECMAScript 语言直接操作的值。ECMAScript 语言类型包括 Undefined、Null、Boolean、String、Symbol、Number、BigInt 和 Object。ECMAScript 语言值是由 ECMAScript 语言类型表征的值。
Undefined 类型恰好有一个值,称为
Null 类型恰好有一个值,称为
Boolean 类型表示具有两个值的逻辑实体,这两个值称为
String 类型是由零个或多个 16 位无符号
不解释 String 内容的 ECMAScript 操作不会施加进一步的语义。解释 String 值的操作会将每个元素视为单个 UTF-16 码元。然而,ECMAScript 不
函数 String.prototype.normalize(参见 String.prototype.localeCompare(参见
这种设计背后的理由是尽可能保持 String 实现的简单和高性能。如果
在本规范中,短语“A、B、... 的字符串连接”(其中每个参数都是 String 值、码元或码元序列)表示这样一个 String 值:其码元序列是按照各参数的顺序,将每个参数中的码元依次连接而成的。
短语“string 从 inclusiveStart 到 exclusiveEnd 的子字符串”(其中 string 是 String 值或码元序列,而 inclusiveStart 和 exclusiveEnd 是
短语“ASCII 单词字符”表示以下 String 值,它仅由 Unicode 基本拉丁区块中的所有字母和数字以及 U+005F(LOW LINE)组成:
由于历史原因,它对各种算法具有重要意义。
如果 searchValue 是空 String 且 fromIndex ≤ string 的长度,则此算法返回 fromIndex。实际上,可以在字符串中的每个位置找到空 String,包括最后一个码元之后的位置。
如果 fromIndex + searchValue 的长度 > string 的长度,则此算法始终返回
如果 searchValue 是空 String,则此算法返回 fromIndex。实际上,可以在字符串中的每个位置找到空 String,包括最后一个码元之后的位置。
Symbol 类型是所有可用作 Object
每个 Symbol 都是唯一且不可变的。
每个 Symbol 都有一个不可变的 [[Description]] 内部槽,其值为 String 或
知名 Symbol 是本规范算法明确引用的内置 Symbol 值。它们通常用作属性的键,而这些属性的值充当规范算法的扩展点。除非另有说明,否则所有
在本规范中,使用标准
%Symbol.name%。具体而言,曾使用以下名称:@@asyncIterator、@@hasInstance、@@isConcatSpreadable、@@| 规范名称 | [[Description]] | 值和用途 |
|---|---|---|
| %Symbol.asyncDispose% |
|
在对象上异步执行资源清理的方法。当await using 声明的作用域完成求值时调用。
|
| %Symbol.asyncIterator% |
|
返回对象默认异步迭代器的方法。由 for-await-of 语句的语义调用。
|
| %Symbol.dispose% |
|
在对象上执行显式资源清理的方法。当using 声明的作用域完成求值时调用。
|
| %Symbol.hasInstance% |
|
确定instanceof 运算符的语义调用。
|
| %Symbol.isConcatSpreadable% |
|
一个 Boolean 值属性,如果为 true,则表示对象应由 Array.prototype.concat |
| %Symbol.iterator% |
|
返回对象默认迭代器的方法。由 for-of 语句的语义调用。 |
| %Symbol.match% |
|
将正则表达式与字符串进行匹配的正则表达式方法。由 String.prototype.match |
| %Symbol.matchAll% |
|
返回一个迭代器、该迭代器生成正则表达式与字符串的匹配项的正则表达式方法。由 String.prototype.matchAll |
| %Symbol.replace% |
|
替换字符串中匹配String.prototype.replace |
| %Symbol.search% |
|
返回字符串中与正则表达式匹配位置的索引的正则表达式方法。由 String.prototype.search |
| %Symbol.species% |
|
一个函数值属性,该函数是用于创建派生对象的 |
| %Symbol.split% |
|
在与正则表达式匹配的索引位置拆分字符串的正则表达式方法。由 String.prototype.split |
| %Symbol.toPrimitive% |
|
将对象转换为相应原始值的方法。由 |
| %Symbol.toStringTag% |
|
一个 String 值属性,用于创建对象的默认字符串描述。由内置方法 Object.prototype.toString |
| %Symbol.unscopables% |
|
一个对象值属性,其自有和继承with 环境绑定中排除的 |
ECMAScript 有两个内置数值类型:Number 和 BigInt。下面的
由于这些数值类型通常无法在不损失精度或截断的情况下相互转换,因此 ECMAScript 语言不提供这些类型之间的隐式转换。当调用需要另一种类型的函数时,程序员必须显式调用 Number 和 BigInt 函数在类型之间进行转换。
ECMAScript 第一版及后续版本曾为某些运算符提供可能损失精度或发生截断的隐式数值转换。为了向后兼容,这些
Number 类型恰好有 18,437,736,874,454,810,627 个(即 NaN 产生。)在某些实现中,外部代码或许能够检测出不同 NaN 值之间的差异,但这种行为是
还有另外两个特殊值,称为+Infinity(或简称 Infinity)和 -Infinity 产生。)
其余 18,437,736,874,454,810,624 个(即
请+0(或简称 0)和 -0 产生。)
18,437,736,874,454,810,622 个(即
其中 18,428,729,675,200,069,632 个(即
其中 s 为 1 或 -1,m 是从 252(含)到 253(不含)
其余 9,007,199,254,740,990 个(即
其中 s 为 1 或 -1,m 是从 0(不含)到 252(不含)
请
如果一个
在本规范中,短语“x 的Number 值”,其中 x 表示一个精确的实数数学量(甚至可能是诸如 π 这样的无理数),是指按以下方式选出的一个
+∞ 的
某些 ECMAScript 运算符仅处理特定范围内的
当 base 为 ** exponent 的结果与
有限精度乘法满足交换律,但并不总是满足结合律。
在 C 和 C++ 中,余数运算符仅接受
% 运算符计算的浮点余数运算结果与 % 定义为以类似 Java 有限精度加法满足交换律,但并不总是满足结合律。
x - y 始终产生与 x + (-y) 相同的结果。
&、^ 或 |))、x (Number) 和 y (Number);返回值:
&,则^,则&, x, y)。^, x, y)。|, x, y)。1.2e+3。ECMAScript 实现者可能会发现 David M. Gay 编写的有关浮点数二进制到十进制转换的论文和代码很有用:
Gay, David M. 正确舍入的二进制-十进制和十进制-二进制转换。数值分析,手稿 90-10。AT&T 贝尔实验室(新泽西州默里山)。1990 年 11 月 30 日。可从以下位置获取
https://ampl.com/_archive/first-website/REFS/rounding.pdf。相关代码可从以下位置获取
http://netlib.sandia.gov/fp/dtoa.c 和
http://netlib.sandia.gov/fp/g_fmt.c,也可以在各个 netlib 镜像站点找到。
BigInt 类型表示
&、^ 或 |))、x (BigInt) 和 y (BigInt);返回值:BigInt。 调用时执行以下步骤:
&,则|,则&, x, y)。^, x, y)。|, x, y)。Object 类型的每个实例(也简称为“Object”)都表示属性的集合。每个属性要么是数据属性,要么是访问器属性:
对象的属性使用
整数索引是这样一个
在逻辑上,所有对象都是属性的集合,但存在多种形式的对象,它们在访问和操作自身属性的语义上有所不同。有关多种对象形式的定义,请参见
此外,某些对象是可调用的;它们称为函数或
本规范使用特性来定义和说明 Object 属性的状态,如
| 特性名称 | 存在该特性的属性类型 | 值域 | 默认值 | 描述 |
|---|---|---|---|---|
| [[Value]] |
|
|
|
对该属性执行 get 访问时检索到的值。 |
| [[Writable]] |
|
Boolean |
|
如果为 |
| [[Getter]] |
|
|
|
如果值不是 |
| [[Setter]] |
|
|
|
如果值不是 |
| [[Enumerable]] |
|
Boolean |
|
如果为 |
| [[Configurable]] |
|
Boolean |
|
如果为 |
在 ECMAScript 中,对象的实际语义通过称为内部方法的算法来规定。ECMAScript 引擎中的每个对象都与一组定义其运行时行为的内部方法相关联。这些内部方法不是 ECMAScript 语言的一部分。本规范定义它们纯粹是为了说明。然而,ECMAScript 实现中的每个对象都必须按照与其关联的内部方法所规定的方式运行。具体如何实现由实现自行确定。
内部方法名称是多态的。这意味着,当在不同对象值上调用同一个内部方法名称时,它们可能执行不同的算法。实际被调用内部方法的对象是该调用的“目标”。如果在运行时,算法的实现尝试使用某个对象不支持的内部方法,则抛出
内部槽对应于与对象、Symbol 或
所有对象都有一个名为 [[PrivateElements]] 的内部槽,它是 PrivateElements 的
本规范使用双重方括号 [[ ]] 括起来的名称来标识内部方法和内部槽。
普通对象是满足以下所有条件的对象:
异质对象是任何非
本规范根据对象的内部方法识别不同种类的
除了其参数之外,内部方法始终可以访问作为方法调用目标的对象。
内部方法隐式返回
| 内部方法 | 描述 | 定义 |
|---|---|---|
| [[GetPrototypeOf]] ( ) | 内部方法 [[GetPrototypeOf]],接收无参数;返回值:( |
在本规范中,它在以下类型中具有定义; |
| [[SetPrototypeOf]] ( proto ) | 内部方法 [[SetPrototypeOf]],接收参数 proto ((Object 或 |
在本规范中,它在以下类型中具有定义; |
| [[IsExtensible]] ( ) | 内部方法 [[IsExtensible]],接收无参数;返回值:( |
在本规范中,它在以下类型中具有定义; |
| [[PreventExtensions]] ( ) | 内部方法 [[PreventExtensions]],接收无参数;返回值:( |
在本规范中,它在以下类型中具有定义; |
| [[GetOwnProperty]] ( propertyKey ) | 内部方法 [[GetOwnProperty]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[DefineOwnProperty]] ( propertyKey, propertyDesc ) | 内部方法 [[DefineOwnProperty]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[HasProperty]] ( propertyKey ) | 内部方法 [[HasProperty]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[Get]] ( propertyKey, receiver ) | 内部方法 [[Get]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[Set]] ( propertyKey, value, receiver ) | 内部方法 [[Set]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[Delete]] ( propertyKey ) | 内部方法 [[Delete]],接收参数 propertyKey ( |
在本规范中,它在以下类型中具有定义; |
| [[OwnPropertyKeys]] ( ) | 内部方法 [[OwnPropertyKeys]],接收无参数;返回值:( |
在本规范中,它在以下类型中具有定义; |
| 内部方法 | 描述 | 定义 |
|---|---|---|
| [[Call]] ( thisArg, argList ) | 内部方法 [[Call]],接收参数 thisArg ( |
在本规范中,它在以下类型中具有定义; |
| [[Construct]] ( argList, newTarget ) | 内部方法 [[Construct]],接收参数 argList ( new 运算符或 super 调用来调用。内部方法的第一个参数是一个 super 调用的参数。第二个参数是最初应用 new 运算符的对象。实现此内部方法的对象称为 |
在本规范中,它在以下类型中具有定义; |
ECMAScript 引擎中 Object 的内部方法必须符合下面规定的不变量列表。普通 ECMAScript Object 以及本规范中的所有标准
任何由实现提供的
实现不得以任何方式允许绕过这些不变量,例如提供实现基本内部方法功能、却不强制执行其不变量的替代接口。
任何内部方法返回的值都必须是
内部方法不得返回
作为第三个不变量的结果,如果一个属性被描述为
知名内在对象是本规范算法明确引用的内置对象,并且通常具有特定于
在本规范中,%name% 形式的引用表示与当前
| 内在对象名称 | 全局名称 | ECMAScript 语言关联 |
|---|---|---|
|
|
|
AggregateError |
|
|
|
Array |
|
|
|
ArrayBuffer |
|
|
|
|
|
|
|
AsyncDisposableStack |
|
|
|
|
|
|
异步 |
|
|
|
异步生成器 |
|
|
|
异步生成器对象的原型( |
|
|
|
所有标准内置异步迭代器对象都间接继承自的对象 | |
|
|
|
Atomics 对象( |
|
|
|
BigInt |
|
|
|
BigInt64Array |
|
|
|
BigUint64Array |
|
|
|
Boolean |
|
|
|
DataView |
|
|
|
Date |
|
|
|
decodeURI 函数( |
|
|
|
decodeURIComponent 函数( |
|
|
|
DisposableStack |
|
|
|
encodeURI 函数( |
|
|
|
encodeURIComponent 函数( |
|
|
|
Error |
|
|
|
eval 函数( |
|
|
|
EvalError |
|
|
|
FinalizationRegistry |
|
|
|
Float16Array |
|
|
|
Float32Array |
|
|
|
Float64Array |
|
|
|
|
|
|
|
Function |
|
|
生成器 |
|
|
|
生成器对象的原型( |
|
|
|
|
Int8Array |
|
|
|
Int16Array |
|
|
|
Int32Array |
|
|
|
isFinite 函数( |
|
|
|
isNaN 函数( |
|
|
|
Iterator |
|
|
|
|
|
|
|
JSON 对象( |
|
|
|
Map |
|
|
|
|
|
|
|
Math 对象( |
|
|
|
Number |
|
|
|
Object |
|
|
|
parseFloat 函数( |
|
|
|
parseInt 函数( |
|
|
|
Promise |
|
|
|
Proxy |
|
|
|
RangeError |
|
|
|
ReferenceError |
|
|
|
Reflect 对象( |
|
|
|
RegExp |
|
|
|
|
|
|
|
Set |
|
|
|
|
|
|
|
SharedArrayBuffer |
|
|
|
String |
|
|
|
|
|
|
|
SuppressedError |
|
|
|
Symbol |
|
|
|
SyntaxError |
|
|
一个无条件抛出 |
|
|
|
所有类型化 Array |
|
|
|
|
TypeError |
|
|
|
Uint8Array |
|
|
|
Uint8ClampedArray |
|
|
|
Uint16Array |
|
|
|
Uint32Array |
|
|
|
URIError |
|
|
|
WeakMap |
|
|
|
WeakRef |
|
|
|
WeakSet |
|
|
Iterator.from 返回的包装迭代器对象的原型( |
其他条目见
规范类型对应于算法中用于描述 ECMAScript 语言构造和
Enum 是规范内部使用且无法从 ECMAScript 代码中直接观察到的值。Enum 使用
List 类型用于说明 new 表达式、函数调用以及其他需要简单有序值列表的算法中参数列表(参见
当算法在未指定顺序的情况下迭代 List 的元素时,所使用的顺序就是这些元素在 List 中的顺序。
为了便于本规范中的表示,可以使用字面量语法来表示新的 List 值。例如,« 1, 2 » 定义了一个具有两个元素的 List 值,其中每个元素都初始化为特定值。新的空 List 可以表示为 « »。
在本规范中,短语“A、B、... 的列表连接”(其中每个参数都是可能为空的 List)表示一个新的 List 值,其元素是按照各参数的顺序,将每个参数中的元素依次连接而成的。
应用于 String 的 List 时,短语“按照码元字典序排序”表示:按照每个码元的数值进行排序,比较到较短字符串的长度为止;如果所有码元均相等,则将较短字符串排在较长字符串之前,如
Record 类型用于描述本规范算法中的数据聚合。Record 类型值由一个或多个具名字段组成。每个字段的值都是
为了便于本规范中的表示,可以使用类似对象字面量的语法来表示 Record。例如,{ [[Field1]]: 42, [[Field2]]:
在规范文本和算法中,可以使用点表示法引用 Record 的特定字段。例如,如果 R 是上一段所示的 Record,则 R.[[Field2]] 是“R 中名为 [[Field2]] 的字段”的简写。
常用 Record 字段组合的模式可以命名,并且该名称可作为字面量 Record 的前缀,用于标识所描述的具体聚合种类。例如:PropertyDescriptor { [[Value]]: 42, [[Writable]]:
Set 类型用于说明
Relation 类型用于说明对 Set 的约束。Relation 类型的值是由其值域中的值的有序对组成的 Set。例如,
严格偏序是满足以下条件的 Relation 值 R。
对于 R 的定义域中的所有 a、b 和 c:
上述两个性质分别称为非自反性和传递性。
严格全序是满足以下条件的 Relation 值 R。
对于 R 的定义域中的所有 a、b 和 c:
上述三个性质分别称为完全性、非自反性和传递性。
Completion Record 规范类型用于说明值和控制流在运行时的传播,例如执行非局部控制转移的语句(break、continue、return 和 throw)的行为。
Completion Record 具有
| 字段名称 | 值 | 含义 |
|---|---|---|
| [[Type]] |
|
发生的完成类型。 |
| [[Value]] |
除 |
所产生的值。 |
| [[Target]] |
String 或 |
定向控制转移的目标标签。 |
有时使用以下简写术语来指代 Completion Record。
本规范中定义的可调用对象只返回正常完成或抛出完成。返回任何其他类型的 Completion Record 都被视为编辑错误。
Reference Record 类型用于说明 delete、typeof、赋值运算符、super
Reference Record 是已解析的名称或(可能尚未解析的)属性绑定;其字段由
| 字段名称 | 值 | 含义 |
|---|---|---|
| [[Base]] | 持有该绑定的值或 |
|
| [[ReferencedName]] | 绑定的名称。如果 [[Base]] 值是 |
|
| [[Strict]] | Boolean | 如果 |
| [[ThisValue]] | 如果不是 super |
本规范使用以下
Property Descriptor 类型用于说明 Object 属性特性的操作和具体化。Property Descriptor 是具有零个或多个字段的
根据某些字段是否存在或被使用,Property Descriptor 值还可以进一步分类为数据 Property Descriptor 和访问器 Property Descriptor。数据 Property Descriptor 是
本规范使用以下
Abstract Closure 规范类型用于引用算法步骤以及一组值。Abstract Closure 是元值,并使用函数应用形式调用,例如 closure(arg1, arg2)。与
在创建 Abstract Closure 的算法步骤中,使用动词“捕获”后跟别名列表来捕获值。创建 Abstract Closure 时,它会捕获当时与每个别名关联的值。在规定调用 Abstract Closure 时所执行算法的步骤中,每个捕获值都使用捕获该值时所用的别名引用。
如果 Abstract Closure 返回
Abstract Closure 作为其他算法的一部分内联创建,如以下示例所示。
Data Block 规范类型用于描述由字节大小(8 位)的数值组成的独立且可变序列。字节值是从 0 到 255 的
为了便于本规范中的表示,可以使用类似数组的语法访问 Data Block 值的各个字节。此表示法将 Data Block 值表示为从 0 开始的
位于可由多个
Shared Data Block 的语义由
本规范使用以下
PrivateElement 类型是一种
PrivateElement 类型的值是其字段由
| 字段名称 | 存在该字段的 [[Kind]] 字段值 | 值 | 含义 |
|---|---|---|---|
| [[Key]] | 全部 |
|
字段、方法或访问器的名称。 |
| [[Kind]] | 全部 |
|
元素的种类。 |
| [[Value]] |
|
|
字段的值。 |
| [[Getter]] |
|
|
私有访问器的 getter。 |
| [[Setter]] |
|
|
私有访问器的 setter。 |
ClassFieldDefinition 类型是用于规定类字段的
ClassFieldDefinition 类型的值是其字段由
| 字段名称 | 值 | 含义 |
|---|---|---|
| [[Name]] |
|
字段的名称。 |
| [[Initializer]] |
ECMAScript |
字段的初始化器(如果有)。 |
Private Name 规范类型用于描述全局唯一的值(即使两个 Private Name 在其他方面无法区分,它们也彼此不同),该值表示私有类元素(字段、方法或访问器)的键。每个 Private Name 都有一个不可变的 [[Description]] 内部槽,其值为 String。可以使用
ClassStaticBlockDefinition Record 是用于封装类静态初始化块可执行代码的
ClassStaticBlockDefinition Record 具有
| 字段名称 | 值 | 含义 |
|---|---|---|
| [[BodyFunction]] |
ECMAScript |
在类的静态初始化期间调用的 |