ECMAScript 章节简介

132 阅读12分钟

前言

ECMAScript标准是深入学习JavaScript原理最好的资料,没有其二。

通过增加对ECMAScript语言的理解,理解javascript现象后面的逻辑,提升个人编码能力。

欢迎关注和订阅专栏 重学前端-ECMAScript协议上篇

阅读建议

  • 了解 整体结构即可。
  • 如果以后想了解某部分细节,能找到对应章节即可。

整体结构

协议的组织结构在协议的 4.5 Organization of This Specification 有个大致的介绍

  • 简介: ECMAScript的简单历史 以及每个版本迭代的内容等。
  • 第1到4章:规范参考文献, 概览,一些标准术语等等
  • 第5章: 定义了整个规范中使用的符号约定。
  • 第6到10章:定义了 ECMAScript 程序运行的执行环境。
  • 第11到17章:定义了实际的 ECMAScript 编程语言,包括其语法编码和所有语言特性的执行语义。
  • 第18到28章:定义了 ECMAScript 标准库。它们包括执行 ECMAScript 程序时可以使用的所有标准对象的定义。
  • 第29章:描述了在SharedArrayBuffer支持的内存上的访问的内存一致性模型以及Atomics对象的方法。
  • 附录内容

简介 Introduction

简单的介绍了ECMAScript协议的起源以及之后每个版本迭代的内容。

所以想知道那个特性是哪个版本增加的也可以从这里获取部分信息。

再贴一下ES2015-ES2024的演进图

第一章 Scope

就一句话, 翻译过来就是:该标准定义了ECMAScript 2025通用编程语言。

2025 这个值随着年份变化就是啦。

第二章 Conformance

合规性。规定了ECMAScript 语言的合规实现要求。

如果实现这个协议,你必须实现什么,不得重新定义什么,禁用扩展什么等等。

哪些是可以选择性实现或者可以不实现的。

第三章 Normative References

规范性引用, 强调是对文档正文内容起到约束力和指导作用的标准、规范或其他文献。

也不多,就那么几个:

  • IEEE 754-2019 浮点数计算相关
  • Unicode Standard : 字符编码
  • ISO/IEC 10646 通用多八位编码字符集
  • JSON 相关的 ECMA-404 和 国际化相关的 ECMA-402

第四章 Overview

概览。

  • 简单介绍了浏览器宿主环境和服务器宿主环境,并阐明一些协议内容或者操作是交给宿主环境实现的。 交给外部实现又分为两种,这上一章节有提到的

    • implementation-approximated
    • implementation-defined ,host-defined
  • 简单介绍了ECMAScript语言特性,

  • 罗列了术语及定义

  • 最后介绍了协议 5-29 章节的整体结构。

第五章 Notational Conventions

句法与词汇语法 和 算法约定。

句法与词汇语法: 包含上下文无关语法,词法和正则表达式语法,数字字符串语法,句法语法,语法标注。

规范中经常使用带编号的列表来精确指定算法中的步骤,这些算法用于详尽描述ECMAScript语言结构所需的语义。

第六章 ECMAScript Data Types and Values

这又分为两种

  • ECMAScript 语言类型
  • ECMAScript 规范类型

ECMAScript语言类型 这对应着 面经 或者开发日常中提到的 数据类型和值。

ECMAScript规范类型 对应于在算法中用于描述 ECMAScript 语言构造和 ECMAScript 语言类型的语义的元值。规范类型包括引用、列表、完成记录、属性描述符、环境记录、抽象闭包和数据块。规范类型值是规范构件,它们不一定对应于 ECMAScript 实现中的任何特定实体。

七章 Abstract Operations

抽象操作。包含

  • 类型转换操作。

取原始值,转为 数字,字符串等等

  • 测试和比较操作
  • 对象的操作

取值,设置值,属性检测,添加属性,函数调用等。

  • 迭代器对象的操作

第八章 Syntax-Directed Operations

语法导向的操作。

  • 运行时的求值
  • 作用域分析
  • 标签

静态语义:重复标签,未定义的breadk目标,未定义的continue目标

  • 函数名称推断
  • 包含

接收一个参数符号(一个语法符号)并返回一个布尔值

  • 杂项

运行时:创建函数对象实例,绑定初始化,迭代器绑定初始化

静态语义:可被赋值的类型, 属性名

第九章 Executable Code and Execution Contexts

可执行代码和执行上下文。

包含环境记录,私有环境记录, 领域(Realm) ,执行上下文,作业和宿主的作业入队操作,Agent, Agent Cluster等等。

第十章 Ordinary and Exotic Objects Behaviours

普通对象和特异对象行为。

  • 普通物体的内部方法与内部槽
  • 函数对象
  • 内置函数对象
  • 内置奇异对象的方法和插槽
  • 代理对象内部方法与内部槽等。

第十一章 ECMAScript Language: Source Text

源文本,即原始JavaScript代码。

源代码类型

  • 全局代码
    全局代码是指直接位于脚本顶层、不属于任何函数内部或其他封闭作用域内的代码段。各种函数、类等结构内部的代码则具有各自的作用域,它们的源文本不属于全局代码范畴。
  • Eval 代码
    指传递给内置eval函数的源文本。
  • 函数代码
    构成该函数主体并决定其行为的源代码段落,包含了函数内部的语句、变量声明等,但并不包含可能在这个函数内部进一步定义的其他嵌套函数的代码。
  • 模块代码
    模块代码是指在导入模块时立即执行以初始化该模块的顶层代码块。不包括模块内部可能存在的任何嵌套函数或其他可封闭作用域结构的定义部分,这些嵌套结构的代码会在各自的作用域内独立地进行解析和执行。

第十二章: ECMAScript Language: Lexical Grammar

词法语法。指其源代码如何被解析器识别和分解为一系列有意义的符号或令牌(tokens)。词法分析是将源代码字符串转换成一系列词法单元(token)的过程,这些单元包括关键字、标识符、操作符、数字、字符串字面量等。

  • Unicode格式控制字符

U+FEFF(零宽度不换行空格),LTR (LEFT-TO-RIGHT MARK, U+200E) 和 RTL ( RIGHT-TO-LEFT MARK, U+200F) 用于设定文本的方向。

  • 空白字符

U+0009 U+000B U+000C U+FEFF, U+0020 U+00A0等

  • 行终止符

换行符(U+000A), 回车符,行分隔符, 段落分隔符。

  • 注释
  • Hashbang 注释

位于脚本文件的首行,例如

#!/usr/bin/env 用于指示脚本使用的解释器或程序。

  • 标记或符号

如关键字、标识符、操作符、数字、字符串字面量等

  • 名称和关键字
  • 标点符号
  • 字面量
  • 自动分号插入规则

第十三章 ECMAScript Language: Expressions

表达式。是程序中的基本构建块,用于表示值、变量或对这些值进行操作的结构。

包含

  • 标志符,
  • 主要表达式
  • 左值表达式
  • 更新表达式或自增/自减表达式
  • 一元运算符
  • 指数运算符
  • 乘法运算符
  • 加法运算符即 +和 -二元操作符,
  • 位移运算符
  • 关系运算符
  • 等性运算符
  • 二进制位运算符
  • 二进制逻辑运算
  • 条件运算符 (?:)
  • 赋值运算符
  • 分组运算符( , )

第十四章 ECMAScript Language: Statements and Declarations Syntax

语句和申明语法。即ifreturn , switch ,throw , debuggertry 等等语句。

第十五章 ECMAScript Language: Functions and Classes

函数和类。包含参数列表,函数定义,箭头函数定义,类定义,方法定义等等。

第十六章 ECMAScript Language: Scripts and Modules

脚本与模块。

页面的script 节点可以添加 type="mode", 来表示这个一个模块JS, 对应这这里的模块。

javascript
复制代码
<script type="module" src="main.js"></script>

第十七章 Error Handling and Language Extensions

错误处理与语言扩展。

规定了错误检测和报告的基本逻辑。

宿主可以提供超越本规范所描述的额外类型、值、对象、属性和函数,规范也定义不允许的扩展内容,

比如

  • 严格模式下定义的函数, 不能拥有名为callerarguments的自有属性,
  • 无论是映射过的还是未映射过的arguments对象,都不能拥有名为"caller"的自有属性。

第十八章 ECMAScript Standard Built-in Objects

标准内置对象。

提到了全局对象,并主要介绍了Object和 Function的特性,相关的原型和其他属性等等。

第十九章 The Global Object

全局对象。详情见上一节的清单。

第二十章 Fundamental Objects

基本对象。 Object, Function, Boolean, Symbol , Error对象。

第二十一章 Numbers and Dates

数字和日期。即Number, BigInt, Math, Date对象。

第二十二章 Text Processing

文本处理。即 String 和 RegExp对象。

第二十三章 Indexed Collections

索引集合。即最常见的 Array 对象,以及 TypedArray 对象,比如Int8Array,Uint8Array的等等,常用来处理音频、图像等二进制数据。

第二十四章 Keyed Collections

键控集合, 通过键(key)而非索引来访问和操作元素的数据结构。

即Map, Set , WeakMap, WeakSet。

第二十五章 Structured Data

结构化数据。具有预定义模式或结构的数据类型,通常用于更好地管理和处理复杂的数据。

常见的 ArrayBuffer , SharedArrayBuffer , DataView , Atomics, JSON 对象。 这里的 JSON 对象,就是全局对象那个包含 JSON.parse和 JSON.stringify方法的这个对象。

第二十六章 Managing Memory

内存管理。 主要介绍 WeakRef , FinalizationRegistry 两个对象。

FinalizationRegistry 可以用来监听对象回收,从而执行某些清理操作或其他操作。

第二十七 Control Abstraction Objects

控制抽象对象。用于简化流程控制和管理代码逻辑的对象。介绍了迭代器,Promise, GeneratorFunction, AsyncGeneratorFunction, Generator , AsyncGenerator , AsyncFunction等对象。

第二十八章 Reflection

反射。包含 Reflect , Proxy 对象和模块命名空间。

第二十九章 Memory Model

Shared Memory(共享内存)和Atomics(原子操作)引入了一种新的内存模型,这种模型使得多线程程序能够通过原子操作进行通信,即使在并行CPU环境下也能确保执行顺序的明确性和一致性。在这个模型中,SharedArrayBuffer作为共享内存的基础,提供了可供多个线程同时访问的数据区域。而Atomics对象提供的方法则保证了对共享内存中数据的原子性操作,即在同一时刻只有一个线程能够修改数据,这样就能避免数据竞争和不一致的状态。

本节介绍就是 SharedArrayBuffer或Atomics对象方法执行期间由抽象操作引入的事件的一系列关系约束。

附录 A Grammar Summary

语法摘要。语句,表达式,函数,类,正则等等的语法。

附录 B Additional ECMAScript Features for Web Browsers

Web浏览器环境额外的特性。比如

  • HTML风格的注释
  • 额外的属性:
    • esacpeunescape 全局函数
    • String.prototype 上 boldblink等属性
  • [[IsHTMLDDA]] Internal Slot, 这是一个特殊插槽, 典型的代表 document.all ,document.all 是一个集合,很多表现却和 undefined 一样。

附录 C The Strict Mode of ECMAScript

严格模式的限制与异常情况。

附录 D Host Layering Points

宿主环境提供或者实现的的对象,函数,能力或服务。例如

  • 宿主环境提供的任务队列的钩子函数
  • 全对对象

附录 E Corrections and Clarifications in ECMAScript 2015 with Possible Compatibility Impact

ECMAScript 201中的修正与澄清及其对兼容性可能产生的影响。比如

  • 以前的版本的规范并未明确规定当Date对象的时间值(time value)为NaN时,Date.prototype.toString方法应该返回什么值。而在ECMAScript 2015版本中,则明确规定了在这种情况下,Date.prototype.toString方法应返回字符串值"Invalid Date"。

  • 以前的版本的ECMAScript并未明确规定在Array.prototype.sort方法中,比较函数(comparefn)返回NaN值时应该如何解读。而在ECMAScript 2015(ES6)中,明确规定了如果comparefn返回NaN,则视为返回了+0(正零)。此外,ES6还规定了对comparefn返回结果应用ToNumber方法进行转化。在先前的版本中,若comparefn返回的结果不是Number类型,则其效果由具体实现自行定义。实际上,很多实现会选择调用ToNumber方法来处理这种情况。这意味着在ES6中,对数组排序时比较函数的返回值有了更确切的规定,从而提升了不同环境下的行为一致性。

附录 F Additions and Changes That Introduce Incompatibilities with Prior Editions

新增与变更造成与之前版本不兼容之处。比如:

  • 在ECMAScript 2015中,函数调用不允许返回一个引用记录(Reference Record)
  • 在ECMAScript 2015中,函数实例的length属性是可配置(configurable)的。而在之前的版本中,这个属性是非可配置(non-configurable)的。
javascript
复制代码
function fn(a, b){}; 
fn.length = 4; 
fn.length // 2

附录 G Colophon

出版信息。

规范是在GitHub上以名为Ecmarkup的纯文本源格式编写的。Ecmarkup是一种结合了HTML和Markdown的方言,它提供了一个框架和工具集,用于以纯文本形式编写ECMAScript规范

附录 H Bibliography

参考文献的清单。

这里和第五章的 Normative References 是有一些区别的,Normative References 强调的是对文档或标准实施的约束性指导。

附录 I Copyright & Software License

版权和软件授权。