EcmaScript 规范
Array
https://262.ecma-international.org/14.0/#sec-array-exotic-objects
An Array is an exotic object that gives special treatment to array index property keys (see 6.1.7). A property whose property name is an array index is also called an element. Every Array has a non-configurable "length" property whose value is always a non-negative integral Number whose mathematical value is strictly less than 232. The value of the "length" property is numerically greater than the name of every own property whose name is an array index; whenever an own property of an Array is created or changed, other properties are adjusted as necessary to maintain this invariant. Specifically, whenever an own property is added whose name is an array index, the value of the "length" property is changed, if necessary, to be one more than the numeric value of that array index; and whenever the value of the "length" property is changed, every own property whose name is an array index whose value is not smaller than the new length is deleted. This constraint applies only to own properties of an Array and is unaffected by "length" or array index properties that may be inherited from its prototypes.
数组是一种特殊对象,对数组索引属性键(参见6.1.7)进行了特殊处理。属性名称为数组索引的属性也被称为元素。每个数组都有一个不可配置的 "length" 属性,其值始终是小于 2^32 的非负整数,其数学值严格小于 2^32。 "length" 属性的值在数值上大于每个名称为数组索引的自有属性的名称;每当创建或更改数组的自有属性时,其他属性会根据需要进行调整,以保持这个不变式。具体来说,每当添加一个名称为数组索引的自有属性时,如果需要, "length" 属性的值会更改为该数组索引的数值值加一;每当 "length" 属性的值更改时,所有名称为数组索引且值不小于新长度的自有属性都会被删除。这个约束仅适用于数组的自有属性,并不受其原型继承的 "length" 或数组索引属性的影响。
- 每个数组对象都有一个 length 属性,其值
始终是小于 2^32 的非负整数
String
- https://262.ecma-international.org/14.0/#sec-ecmascript-language-types-string-type
- https://www.mulingyuer.com/archives/838/
The String type is the set of all ordered sequences of zero or more 16-bit unsigned integer values (“elements”) up to a maximum length of 2^53 - 1 elements. The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a UTF-16 code unit value. Each element is regarded as occupying a position within the sequence. These positions are indexed with non-negative integers. The first element (if any) is at index 0, the next element (if any) at index 1, and so on. The length of a String is the number of elements (i.e., 16-bit values) within it. The empty String has length zero and therefore contains no elements.
ECMAScript operations that do not interpret String contents apply no further semantics. Operations that do interpret String values treat each element as a single UTF-16 code unit. However, ECMAScript does not restrict the value of or relationships between these code units, so operations that further interpret String contents as sequences of Unicode code points encoded in UTF-16 must account for ill-formed subsequences. Such operations apply special treatment to every code unit with a numeric value in the inclusive interval from 0xD800 to 0xDBFF (defined by the Unicode Standard as a leading surrogate, or more formally as a high-surrogate code unit) and every code unit with a numeric value in the inclusive interval from 0xDC00 to 0xDFFF (defined as a trailing surrogate, or more formally as a low-surrogate code unit) using the following rules:
字符串类型是由零个或多个 16 位无符号整数值("元素")组成的有序序列,最大长度为 2^53 - 1 个元素。字符串类型通常用于表示 ECMAScript 程序中的文本数据,在这种情况下,字符串中的每个元素都被视为一个 UTF-16 代码单元值。每个元素被认为占据序列中的一个位置。这些位置用非负整数进行索引。第一个元素(如果有)的索引为 0,下一个元素(如果有)的索引为 1,依此类推。字符串的长度是其中的元素(即 16 位值)的数量。空字符串的长度为零,因此不包含任何元素。
不解释字符串内容的 ECMAScript 操作不应用进一步的语义。解释字符串值的操作将每个元素视为单个 UTF-16 代码单元。然而,ECMAScript 不限制这些代码单元的值或关系,因此进一步将字符串内容解释为以 UTF-16 编码的 Unicode 代码点序列的操作必须考虑到不正确的子序列。这样的操作对于每个数值在从 0xD800 到 0xDBFF(由 Unicode 标准定义为前导代理或更正式地定义为高代理代码单元)的闭区间内以及每个数值在从 0xDC00 到 0xDFFF(定义为尾随代理或更正式地定义为低代理代码单元)的闭区间内的每个代码单元应用特殊处理,使用以下规则:
最大长度为 2^53 - 1
Ecmascript ES 目录总结
ECMAScript Data Types and Values
ECMAScript Language Types
- 定义了 ECMAScript 语言类型:可以直接操作的类型值
类型 | 描述 | 特点 |
---|---|---|
Undefined | 未定义类型 | 变量声明了但未赋值时的类型 |
Null | 空值类型 | 表示无值或空值 |
Boolean | 布尔类型 | 只有两个值:true 和 false |
String | 字符串类型 | 用于表示文本数据 |
Symbol | 符号类型 | 表示唯一的、不可变的原始值 |
Number | 数字类型 | 双精度 64 位浮点数,用于表示整数和浮点数 |
BigInt | 大整数类型 | 用于表示任意精度的整数 |
Object | 对象类型 | 用于表示复杂的数据结构,如数组、函数、日期等 |
ECMAScript Specification Types
定义了 ECMAScript 规范类型: 不能操作的 描述语言的语义和行为的
A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types include Reference, List, Completion Record, Property Descriptor, Environment Record, Abstract Closure, and Data Block. Specification type values are specification artefacts that do not necessarily correspond to any specific entity within an ECMAScript implementation. Specification type values may be used to describe intermediate results of ECMAScript expression evaluation but such values cannot be stored as properties of objects or values of ECMAScript language variables.
规范类型对应于算法中使用的元值,用于描述 ECMAScript 语言构造和 ECMAScript 语言类型的语义。规范类型包括引用、列表、完成记录、属性描述符、环境记录、抽象闭包和数据块。规范类型值是规范工件,不一定对应于 ECMAScript 实现中的任何特定实体。规范类型值可用于描述 ECMAScript 表达式求值的中间结果,但此类值不能存储为对象的属性或 ECMAScript 语言变量的值。
规范类型 | 描述 | 用途 |
---|---|---|
Enum Specification Type | 枚举类型 | 用于表示一组有限的命名常量值 |
List and Record Specification Types | 列表和记录类型 | 用于表示一组有序的值和一组键值对 |
Set and Relation Specification Types | 集合和关系类型 | 用于表示一组无序的唯一值和一组有序的键值对 |
Completion Record Specification Type | 完成记录类型 | 用于表示语句或表达式的执行结果 |
Reference Record Specification Type | 引用记录类型 | 用于表示对变量或属性的引用 |
Property Descriptor Specification Type | 属性描述符类型 | 用于表示对象属性的特性和行为 |
Environment Record Specification Type | 环境记录类型 | 用于表示变量和函数的作用域和绑定关系 |
Abstract Closure Specification Type | 抽象闭包类型 | 用于表示函数的内部状态和执行上下文 |
Data Blocks | 数据块类型 | 用于表示二进制数据的缓冲区 |
PrivateElement Specification Type | 私有元素类型 | 用于表示类中的私有成员 |
ClassFieldDefinition Record Specification Type | 类字段定义记录类型 | 用于表示类中的字段定义 |
Private Names | 私有名称类型 | 用于表示类中的私有成员名称 |
ClassStaticBlockDefinition Record Specification Type | 类静态块定义记录类型 | 用于表示类中的静态块定义 |
抽象操作 (Abstract Operations )
- 描述语言的底层行为和算法; 包括类型转换,测试和比较的操作,对象的操作定义
Type Conversion (类型转换)
Type Conversion | |
---|---|
ToPrimitive ( input [ , preferredType ] ) | 将输入值转换为原始值。 |
OrdinaryToPrimitive ( O, hint ) | 将普通对象转换为原始值。 |
ToBoolean ( argument ) | 将值转换为布尔值。 |
ToNumeric ( value ) | 将值转换为数值。 |
ToNumber ( argument ) | 将值转换为数字。 |
ToIntegerOrInfinity ( argument ) | 将值转换为整数或无穷大。 |
ToInt32 ( argument ) | 将值转换为 32 位有符号整数。 |
ToUint32 ( argument ) | 将值转换为 32 位无符号整数。 |
ToInt16 ( argument ) | 将值转换为 16 位有符号整数。 |
ToUint16 ( argument ) | 将值转换为 16 位无符号整数。 |
ToInt8 ( argument ) | 将值转换为 8 位有符号整数。 |
ToUint8 ( argument ) | 将值转换为 8 位无符号整数。 |
ToUint8Clamp ( argument ) | 将值转换为 8 位无符号整数(使用截断方式)。 |
ToBigInt ( argument ) | 将值转换为 BigInt 类型。 |
StringToBigInt ( str ) | 将字符串转换为 BigInt 类型。 |
ToBigInt64 ( argument ) | 将值转换为 64 位有符号 BigInt。 |
ToBigUint64 ( argument ) | 将值转换为 64 位无符号 BigInt。 |
ToString ( argument ) | 将值转换为字符串。 |
ToObject ( argument ) | 将值转换为对象。 |
ToPropertyKey ( argument ) | 将值转换为属性键。 |
ToLength ( argument ) | 将值转换为长度值。 |
CanonicalNumericIndexString ( argument ) | 将值转换为规范化的数值索引字符串。 |
ToIndex ( value ) | 将值转换为索引值。 |
Testing and Comparison Operations (测试和比较操作)
Testing and Comparison Operations | |
---|---|
RequireObjectCoercible ( argument ) | 检查参数是否为对象,如果不是则抛出 TypeError 异常。 |
IsArray ( argument ) | 检查参数是否为数组。 |
IsCallable ( argument ) | 检查参数是否为可调用对象。 |
IsConstructor ( argument ) | 检查参数是否为构造函数。 |
IsExtensible ( O ) | 检查对象是否可扩展。 |
IsIntegralNumber ( argument ) | 检查参数是否为整数。 |
IsPropertyKey ( argument ) | 检查参数是否为属性键。 |
IsRegExp ( argument ) | 检查参数是否为正则表达式对象。 |
SS: IsStringWellFormedUnicode ( string ) | 检查字符串是否为合法的 Unicode 字符串。 |
SameValue ( x, y ) | 比较两个值是否相等,包括 NaN 和+0/-0。 |
SameValueZero ( x, y ) | 比较两个值是否相等,不包括 NaN 和+0/-0。 |
SameValueNonNumber ( x, y ) | 比较两个非数字类型的值是否相等。 |
IsLessThan ( x, y, LeftFirst ) | 比较两个值的大小关系。 |
IsLooselyEqual ( x, y ) | 比较两个值是否宽松相等。 |
IsStrictlyEqual ( x, y ) | 比较两个值是否严格相等。 |
Operations on Objects (操作对象)
Operations on Objects | |
---|---|
Operations on Iterator Objects |
可执行代码和执行上下文 (Executable Code and Execution Contexts)
可执行代码是指ECMAScript代码中可以被执行的部分,包括函数、模块、脚本等。执行上下文是指ECMAScript代码执行时的环境,包括变量、函数、this值等。
在ECMAScript中,每个可执行代码都有一个相关联的执行上下文。执行上下文包括以下几个部分:
变量环境:用于存储变量和函数声明。
词法环境:用于存储变量和函数的词法绑定。
this值:用于存储当前函数的this值。
可执行代码:用于存储当前执行的可执行代码。
外部环境:用于存储当前执行上下文的外部环境。
普通对象和异类对象行为 (Ordinary and Exotic Objects Behaviours)
- 普通对象和异类对象在 ECMAScript 中有以下区别:
行为
:普通对象的行为由 ECMAScript 规范中的基本行为定义,而异类对象的行为由 ECMAScript 规范中的异类对象行为定义。内部属性
:普通对象的内部属性由 ECMAScript 规范中的基本内部方法定义,而异类对象的内部属性由 ECMAScript 规范中的异类对象内部方法定义。扩展性
:普通对象默认是可扩展的,而异类对象默认是不可扩展的。原型
:普通对象的原型是 Object.prototype,而异类对象的原型可以是任何对象。构造函数
:普通对象的构造函数是 Object,而异类对象的构造函数可以是任何函数。实例化
:普通对象可以通过字面量、构造函数、Object.create()等方式实例化,而异类对象只能通过构造函数实例化。
异类对象类型 | 描述 |
---|---|
Bound Function Exotic Objects | 绑定函数对象,用于绑定函数的 this 值和参数。 |
Array Exotic Objects | 数组对象,用于存储一组有序的值。 |
String Exotic Objects | 字符串对象,用于存储字符串值。 |
Arguments Exotic Objects | 参数对象,用于存储函数的参数。 |
Integer-Indexed Exotic Objects | 整数索引对象,用于存储一组有序的值,并支持整数索引访问。 |
Module Namespace Exotic Objects | 模块命名空间对象,用于表示模块的命名空间。 |
Immutable Prototype Exotic Objects | 不可变原型对象,用于表示不可变的原型对象。 |
语言表达式 (Expressions)
表达式类型 | 描述 |
---|---|
标识符(Identifiers) | 用于表示变量、函数或对象的名称。 |
主表达式(Primary Expression) | 包括字面量、标识符、括号表达式等。 |
左手表达式(Left-Hand-Side Expressions) | 用于赋值操作的表达式,包括标识符、属性访问、数组索引等。 |
更新表达式(Update Expressions) | 用于增加或减少变量值的表达式,包括前缀和后缀递增递减运算符。 |
一元运算符(Unary Operators) | 对单个操作数进行操作的运算符,如取反、递增递减、类型转换等。 |
指数运算符(Exponentiation Operator) | 用于计算指数的运算符。 |
乘法运算符(Multiplicative Operators) | 用于执行乘法、除法和取模运算的运算符。 |
加法运算符(Additive Operators) | 用于执行加法和减法运算的运算符。 |
位移运算符(Bitwise Shift Operators) | 用于执行二进制位移操作的运算符。 |
关系运算符(Relational Operators) | 用于比较两个值的大小关系的运算符。 |
相等运算符(Equality Operators) | 用于比较两个值是否相等的运算符。 |
二进制位运算符(Binary Bitwise Operators) | 用于执行二进制位运算的运算符,如按位与、按位或等。 |
二进制逻辑运算符(Binary Logical Operators) | 用于执行二进制逻辑运算的运算符,如逻辑与、逻辑或等。 |
条件运算符(Conditional Operator) | 也称为三元运算符,根据条件的真假选择不同的值或表达式。 |
赋值运算符(Assignment Operators) | 用于将值赋给变量或对象属性的运算符。 |
逗号运算符(Comma Operator) | 用于在表达式中多个表达式之间进行分隔的运算符。 |
左手表达式
章节 | 描述 |
---|---|
静态语义(Static Semantics) | 描述左手表达式的静态语义规则。 |
属性访问器(Property Accessors) | 描述通过点运算符和方括号运算符进行属性访问的语法和行为。 |
使用表达式键进行属性访问的求值过程(EvaluatePropertyAccessWithExpressionKey) | 描述使用表达式作为属性键进行属性访问的求值过程。 |
使用标识符键进行属性访问的求值过程(EvaluatePropertyAccessWithIdentifierKey) | 描述使用标识符作为属性键进行属性访问的求值过程。 |
new 运算符(The new Operator) | 描述使用 new 运算符创建对象实例的语法和行为。 |
函数调用(Function Calls) | 描述函数调用的语法和行为,包括参数传递和执行函数体。 |
super 关键字(The super Keyword) | 描述 super 关键字在继承关系中的使用和语义。 |
参数列表(Argument Lists) | 描述函数调用中的参数列表的语法和行为。 |
可选链(Optional Chains) | 描述可选链操作符的语法和行为,用于安全地访问可能为 null 或 undefined 的属性。 |
import 调用(Import Calls) | 描述使用 import 语法进行模块导入的语法和行为。 |
标记模板(Tagged Templates) | 描述标记模板字符串的语法和行为,用于自定义模板字符串的处理方式。 |
元属性(Meta Properties) | 描述元属性的语法和行为,用于访问特定的元数据信息。 |
定义 new 关键有哪些操作
定义 this 指向
语句和声明 (Statements and Declarations)
章节 | 描述 |
---|---|
语句语义(Statement Semantics) | 描述语句的语义和执行顺序。 |
块语句(Block) | 描述用花括号括起来的一组语句的语法和行为。 |
声明和变量声明语句(Declarations and the Variable Statement) | 描述变量和函数声明的语法和行为。 |
空语句(Empty Statement) | 描述一个空语句的语法和行为。 |
表达式语句(Expression Statement) | 描述将表达式作为语句的语法和行为。 |
if 语句(The if Statement) | 描述条件语句的语法和行为,用于根据条件执行不同的代码块。 |
迭代语句(Iteration Statements) | 描述循环语句的语法和行为,如 for 循环、while 循环等。 |
continue 语句(The continue Statement) | 描述 continue 语句的语法和行为,用于跳过当前循环的剩余部分。 |
break 语句(The break Statement) | 描述 break 语句的语法和行为,用于跳出当前循环或 switch 语句。 |
return 语句(The return Statement) | 描述 return 语句的语法和行为,用于从函数中返回一个值。 |
with 语句(The with Statement) | 描述 with 语句的语法和行为,用于创建一个临时的作用域链。 |
switch 语句(The switch Statement) | 描述 switch 语句的语法和行为,用于根据不同的条件执行不同的代码块。 |
标记语句(Labelled Statements) | 描述标记语句的语法和行为,用于在代码中创建标记以供其他语句引用。 |
throw 语句(The throw Statement) | 描述 throw 语句的语法和行为,用于抛出一个异常。 |
try 语句(The try Statement) | 描述 try 语句的语法和行为,用于捕获和处理异常。 |
debugger 语句(The debugger Statement) | 描述 debugger 语句的语法和行为,用于在代码中设置断点。 |
函数和类 (Functions and Classes )
章节 | 描述 |
---|---|
参数列表(Parameter Lists) | 描述函数或方法定义中的参数列表的语法和行为。 |
函数定义(Function Definitions) | 描述使用 function 关键字定义函数的语法和行为。 |
箭头函数定义(Arrow Function Definitions) | 描述使用箭头函数语法定义函数的语法和行为。 |
方法定义(Method Definitions) | 描述在对象或类中定义方法的语法和行为。 |
生成器函数定义(Generator Function Definitions) | 描述使用 function 关键字定义生成器函数的语法和行为。 |
异步生成器函数定义(Async Generator Function Definitions) | 描述使用 async 关键字定义异步生成器函数的语法和行为。 |
类定义(Class Definitions) | 描述使用 class 关键字定义类的语法和行为。 |
异步函数定义(Async Function Definitions) | 描述使用 async 关键字定义异步函数的语法和行为。 |
异步箭头函数定义(Async Arrow Function Definitions) | 描述使用箭头函数语法定义异步函数的语法和行为。 |
尾部位置调用(Tail Position Calls) | 描述尾部位置调用的语法和行为,用于优化递归函数的性能。 |
结构化数据 (Structured Data )
章节 | 描述 |
---|---|
JSON 对象(The JSON Object) | 描述了 ECMAScript 语言中的 JSON 对象和 JSON 字符串的解析和序列化。 |
ArrayBuffer 对象(The ArrayBuffer Object) | 描述了 ECMAScript 语言中的 ArrayBuffer 对象和二进制数据的处理。 |
DataView 对象(The DataView Object) | 描述了 ECMAScript 语言中的 DataView 对象和二进制数据的读写操作。 |
TypedArray 对象(The TypedArray Objects) | 描述了 ECMAScript 语言中的 TypedArray 对象和基于 ArrayBuffer 的类型化数组。 |
SharedArrayBuffer 对象(The SharedArrayBuffer Object) | 描述了 ECMAScript 语言中的 SharedArrayBuffer 对象和多线程共享内存的处理。 |
Atomics 对象(The Atomics Object) | 描述了 ECMAScript 语言中的 Atomics 对象和原子操作的处理。 |
控制抽象对象 (Control Abstraction Objects )
章节 | 描述 |
---|---|
迭代器协议(The Iterator Protocol) | 描述了 ECMAScript 语言中的迭代器协议和可迭代对象的处理。 |
Promise 对象(Promise Objects) | 描述了 ECMAScript 语言中的 Promise 对象和异步编程的处理。 |
GeneratorFunction 对象(GeneratorFunction Objects) | 描述了 ECMAScript 语言中的 GeneratorFunction 对象和生成器函数的处理。 |
AsyncGeneratorFunction 对象(AsyncGeneratorFunction Objects) | 描述了 ECMAScript 语言中的 AsyncGeneratorFunction 对象和异步生成器函数的处理。 |
Generator 对象(Generator Objects) | 描述了 ECMAScript 语言中的 Generator 对象和生成器的处理。 |
AsyncGenerator 对象(AsyncGenerator Objects) | 描述了 ECMAScript 语言中的 AsyncGenerator 对象和异步生成器的处理。 |
AsyncFunction 对象(AsyncFunction Objects) | 描述了 ECMAScript 语言中的 AsyncFunction 对象和异步函数的处理。 |
重点文章
- https://262.ecma-international.org/14.0/#sec-syntax-directed-operations
- https://262.ecma-international.org/14.0/#sec-executable-code-and-execution-contexts
- https://262.ecma-international.org/14.0/#sec-ordinary-and-exotic-objects-behaviours
- https://262.ecma-international.org/14.0/#sec-arguments-exotic-objects