前言
ECMAScript标准是深入学习JavaScript原理最好的资料,没有其二。
通过增加对ECMAScript语言的理解,理解javascript现象后面的逻辑,提升个人编码能力。
欢迎关注和订阅专栏 重学前端-ECMAScript协议上篇
一些基本概念
-
ECMA : 的全称是 E uropean C omputer M anufacturers Association,即欧洲计算机制造商协会。后来发展成为一个国际性的标准化组织,专注于信息和通信技术领域。该组织的主要目标是评估、开发和推广各种技术标准,以促进全球信息技术和电信产业的兼容性和互操作性。
-
ECMAScript: 由 ECMA 国际通过 ECMA-262 标准化的脚本程序设计语言规范 。 当然还有其他ECMA标准 ECMA 国际组织 各种文案
ECMA-402 提一嘴,浏览器环境中的全局对象 Intl 对象就是协议对应的实现,Intl 对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比、数字格式化,和日期时间格式化。 具体应用,比如 数字千分位。
javascript
javascript
复制代码
console.log(
new Intl.NumberFormat('en-us').format(
10000000,
),
);
// 10,000,000
-
JavaScript: 现在可以理解为ECMAScript 规范的一种实现,或者说是遵循了ECMAScript语言规范 的编程语言。 因为 javascript这个词出现于 1995年,而ECMAScript 的第一版本 1997年才通过。
-
JavaScript 引擎: 引擎的主要职责包括解析和编译 JavaScript代码、把源代码转换为机器可识别的指令,并管理内存、变量作用域、垃圾回收等运行时行为。知名的有
- 谷歌的 v8,chrome浏览器和nodejs都有使用
- 苹果的 JavaScriptCore
- Mozilla 的SpiderMonkey
- 微软的 Chakra
-
JavaScript 宿主环境: 支持JavaScript代码运行的平台或容器,为JavaScript引擎提供了执行上下文,并扩展了语言的核心功能。宿主环境提供了与外部世界交互的能力,比如访问文件系统、网络资源、图形用户界面等。
- 浏览器:是JavaScript最常见的宿主环境之一,它为JavaScript提供了诸如window、document、fetch, Promise等全局对象。
- node.js:是一个基于Chrome V8 JavaScript引擎的服务器端运行时环境,它的宿主环境提供了全局global对象以及一系列用于文件I/O、网络编程、进程管理、模块系统等功能的API,使JavaScript能进行服务器端开发。
- deno:服务器端 JavaScript 运行环境,使用 V8 引擎,但提供了不同的安全模型和 API。
JavaScript引擎负责解释和执行JavaScript语言的核心部分,而宿主环境则扩展了这门语言的功能,使其能适应不同应用场景的需求。
JavaScript引擎本身不能独立执行完整的JavaScript程序,需要与宿主环境协同工作。
ECMAScript协议版本和文档
ES6 以前, 即 ES1 到 ES5:
- ES1:ECMA-262, 1st edition, June 1997 - PDF file
- ES2:ECMA-262, 2nd edition, August 1998 - PDF file
- ES3:ECMA-262, 3rd edition, December 1999 - PDF file
- ES5:ECMA-262, 5th edition, December 2009 - PDF file
- ES5.1:ECMA-262, 5.1th edition, June 2011 - PDF file
有同志会问题 ES4 呢? 该版本提案改动很激进。它应该引入了很多的新特性,如类、模块、迭代器和生成器,但是由于规模太大以及浏览器兼容性问题,最终没有被采纳。
ES1 到 ES5 的演进图,真版本也就是 ES1, ES3, ES5 如下:

ES2015 也就是 ES6, 同样的 ES2016 就是 ES7,往后推就行
- ES6(ES2015) www.ecma-international.org/ecma-262/6....
- ES7(ES2016) www.ecma-international.org/ecma-262/7....
- ES8(ES2017) www.ecma-international.org/ecma-262/8....
- ES9(ES2018)http://www.ecma-international.org/ecma-262/9.0/
- ES10(ES2019) www.ecma-international.org/ecma-262/10...
- ES11(ES2020)http://www.ecma-international.org/ecma-262/11.0/
- ES12(ES2021) www.ecma-international.org/ecma-262/12...
- ES13(ES2022) www.ecma-international.org/ecma-262/13...
- ES14(ES2023) www.ecma-international.org/ecma-262/14...
- ES15(ES2024) www.ecma-international.org/ecma-262/15...
ES2015 到 ES2024 的演进图

另外 tc39.es/ecma262/ 的文档是最精确且最新的 ECMAScript 规范。它还包含了Stage 4 阶段提案内容。
数字不好记, 按照年份也有对应的文档地址
- ES2021 tc39.es/ecma262/202...
- ES2022 tc39.es/ecma262/202...
- ES2023 tc39.es/ecma262/202...
- ES2024 tc39.es/ecma262/202...
- 最新:tc39.es/ecma262/
本地阅读协议
线上版本都是需要联网的,可以把最新的文档下载本地,可以提高学习效率:
- 下载标准仓库
git clone https://github.com/tc39/ecma262
- 安装依赖
npm isntall
- 构建
npm run build
- 打开
out
目录下的index.html 即可离线阅读,nice

ECMAScript 协议落实流程
从上面的协议版本,可以得知 EACMScript 262协议本身是一直在更改迭代的。
从一个想法到完全规范化的功能遵循一个规范的流程, 即 The TC39 Process,这个过程共有六个阶段:初步草案阶段以及五个"成熟"阶段。
- Stage 0:初步想法阶段,提出一个概念或草案。
- Stage 1:正式提案阶段,明确表述提案。
- Stage 2:草案阶段,提案需有详细的规范、初始实现以及对现有生态影响的评估。
- Stage 2.7:通过测试和原型开发获得初步的特性经验。
- Stage 3:候选阶段,提案应当被大多数浏览器引擎实现,并在实际使用中进行测试。
- Stage 4:完成阶段,提案已获得广泛共识,各主流引擎实现稳定。
有个 Stage 2.7 有点特别,一笑而过就行。
你可以在 github.com/tc39/ecma26... 查看处于各个阶段的提议:
地址 | 包含内容 |
---|---|
Finished Proposals | 已达Stage 4,包含在规范的最新草案中 |
Active Proposals | 包含 Stage 2 和 Stage 3 |
Stage 1 Proposals | Stage 1 |
Stage 0 Proposals | Stage 0 |
Inactive Proposal | 未激活的草案 |
几个术语
协议有些内容是 ECMASript 实现的, 有些了是宿主环境去实现的,而宿主环境实现的部分其实还有两种, 一种是有推荐的行为, 另外一种自己看着办。
在协议 4.4 Terms and Definitions 有相关说明:
implementation-approximated
外部环境,宿主环境实现,规范中具有推荐的理想行为。
主要集中在 Math 这块,比如Math.acos, Math.acosh, Math.asinh, Math.atanh 等的返回值。
implementation-defined
该词条再协议中出现50多次。
本规范的外部定义,未提出任何建议,符合规范的实现可以在这个规范提出的约束范围内自由选择任何行为。
协议只规定了 生成 0 到1 的值, 如何生成 宿主 自己办。
返回的内容实现定义的,但是用于以方便的、人类可读的形式表示当前时区中的 Date。
- 如何识别 NaN The Number Type
- 宿主环境可以通过将执行上下文推送到执行上下文堆栈来准备执行以评估代码。具体步骤是实现定义的。Jobs and Host Operations to Enqueue Jobs
- 其他等等
host-defined
同 implementation-defined。
ECMAScript 的全局对象
这里对应这协议的第19章 19 The Global Object
ECMAScript 协议全局对象内置了不少属性, 宿主环境也定了不少属性,那你知道平时编程接触的常见对象哪些是 协议本身内置的,还是宿主环境提供的嘛。
只要知道协议内置的属性即可:
类别 | 属性名 | 备注 |
---|---|---|
值属性 (4) | globalThis | |
Infinity | ||
NaN | ||
undefined | ||
函数属性 (9) | ||
eval | ||
isFinite | ||
isNaN | ||
parseFloat | ||
parseInt | ||
decodeURI | ||
decodeURIComponent | ||
encodeURI | ||
encodeURIComponent | ||
构造函数属性 (40) | ||
AggregateError | ||
Array | ||
ArrayBuffer | ||
BigInt | ||
BigInt64Array | ||
BigUint64Array | ||
Boolean | ||
DataView | ||
Date | ||
Error | ||
EvalError | ||
FinalizationRegistry | ||
Float32Array | ||
Float64Array | ||
Function | ||
Int8Array | ||
Int16Array | ||
Int32Array | ||
Map | ||
Number | ||
Object | ||
Promise | ||
Proxy | ||
RangeError | ||
ReferenceError | ||
RegExp | ||
Set | ||
SharedArrayBuffer | ||
String | ||
Symbol | ||
SyntaxError | ||
TypeError | ||
Uint8Array | ||
Uint8ClampedArray | ||
Uint16Array | ||
Uint32Array | ||
URIError | ||
WeakMap | ||
WeakRef | ||
WeakSet | ||
其他属性 (4) | ||
Atomics | ||
JSON | ||
Math | ||
Reflect |
如果是浏览器宿主环境 ,外加上附录 额外的全局对象 B.2.1 Additional Properties of the Global Object
类别 | 属性名 | 备注 |
---|---|---|
额外的 (2) | ||
escape | ||
unescape |
所以,上面的除外,那都是宿主环境提供的了, 比如浏览器常见的对象 window
, document
, navigator
等等。
ECMAScript实现程度检测
如果你想知道某款浏览器 对协议的实现程度,
可以通过打开 bakkot.github.io/test262-web..., 点击Remote加载远程的测试包,就可以开始测试了。