ECMAScript 阅读指南(一)

2,181 阅读7分钟

目录

  1. ECMAScript 阅读指南(一) 基本介绍、规范版本、阅读方式等背景知识(已了解的人可以跳过)

  2. ECMAScript 阅读指南(二) 介绍规范的重点概念

  3. ECMAScript 阅读指南(三) 介绍规范的重点概念(摸鱼中,待续)

前言

本系列文章介绍 ECMAScript® Language Specification(ECMAScript 语言规范,简称 ES)的重点概念、阅读技巧和注意事项等,帮助 JS 开发者阅读、熟悉 ES 规范。虽然本文的核心是 ECMAScript,但是我不会过度夸大它的重要性。我认为熟悉 ES 不是开发者的必备要求,而只是一项锦上添花的技能。一个不熟悉 ES 文档的 JS 开发者也有可能成为一个优秀的开发者,反之,将 ES 规范如数家珍的文档专家未必具备优秀的工程能力。过度拔高学习 ECMAScript 的重要性的行为是不值得提倡的。如果你认为阅读 ECMAScript 有难度,也不必太过焦虑,这是正常现象。

希望本系列能够帮助中文 JS 开发者上手理解 ES 规范,我会尽可能直白地讲解。阅读本文需要有一定 JS 基础。编写本文之前我阅读了其他优秀的文章,也推荐阅读:

  1. Timothy Gu 的 How to Read the ECMAScript Specification
  2. V8 团队的 Understanding ECMAScript

什么是 ECMAScript ?

ECMAScript 是 Ecma International 颁布的一部语言标准,编号为 262,所以又称为 ECMA-262。Ecma International 是一个制定信息和通讯技术方面的国际标准的组织。ECMAScript 由 EMCA International 的 TC39Technical Committee 39)技术委员会编写,TC39 将编写好的 ECMAScript 标准文档提交给 Ecma International,再由 Ecma International 正式发布。从 2015 年开始,ECMAScript 每年发布一个正式版,并在标题中写上年份,比如「ECMAScript® 2020 Language Specification, 11th edition」,可简称为「ES2020」或「ES11」。

很多人会说 ECMAScript 是 JavaScript 的标准,而 JavaScript 是 ECMAScript 的实现。实际上,JavaScript 编程语言先于规范诞生,「ECMAScript」这一名字是当时提交至标准协会时起的名称,它们两者可谓共生共荣、相依相存,因此也可以将 ECMAScript 理解为 JavaScript 的正式名称。

为什么要阅读 ECMAScript 规范?

  1. JavaScript 具有很多奇怪奇妙的语言特性,我认为在理解的原理的基础上记忆,胜于死记硬背。随着 JS 的发展,出现了越来越多的功能,比如类字段、Proxy 代理等,在某些场景下它们的特性会比较奇怪,只有阅读规范才能深入理解它们。
  2. 我们在使用 JS 的过程用不免会遇到很多困惑之处,一般而言查阅 MDN、翻书就能解决问题,但是如果连书上也讲错了呢?这时候就必须查规范文档。在我之前的文章 你真的明白为何 1+"1" 等于“11”吗? 中,我通过查阅规范发现了《JS高级程序设计》的一个错误,同时也纠正我之前的理解偏差。如果不查规范的话,就不可能搞明白这个问题。

阅读哪个版本?

Ecma International 会将历代规范发布在他们官网,截止目前2020年10月4日,最新的 Standard 标准版本是 Standard ECMA-262 ECMAScript® 2020 Language Specification

而 TC39 会在他们的网站上发布另一个 Draft(草案)版本,截止目前最新的是 ECMAScript® 2021 Language Specification,更新日期是2020年10月1日。

为什么 ECMAScript 会在两个网站上出现两个版本?为什么 TC39 会在 2020 年就发布了 2021 年的内容?应该以哪个为准?

Ecma International 每年发布一次新的正式版规范。而 TC39 作为 ES 规范的编写者,会在一年之内定期地多次发布新内容到他们的网站上,因此 TC39 的版本会比 Ecma International 官网上的更加新一些,其中包含一些已完成但暂未正式列入规范的新内容(详见下一章节)。TC39 网站发布的是一种所谓的 Living Standard 实时标准,他们会定期更新文档,始终呈现最新的内容。TC39 会每年将自己编写的内容整理出来,在上半年提交给 Ecma International 作为正式版于七月份发布。而当提交之后,TC39 在当年后续更新的内容即被标记为下一年的内容。这就是为什么 TC39 网站上在 2020 年就出现了 2021 年的内容。

除非你想明确地了解各年度的 ECMAScript 有何区别,或者想针对某一个特定版本来学习,那我推荐在 Ecma International 官网上找对应的版本来阅读。否则,对于大多数情况来说,我推荐阅读 TC39 网站上的 Living Standard 真·最新版本

ECMAScript 修改点的五个阶段

要对 ECMAScript 规范做出任何修改,比如要新增、改写一项功能,一般需要经历五个阶段,它定义在 The TC39 Process 中,分别是 Strawperson、Proposal、Draft、Candidate、Finished。只有走完这五个阶段进入 Finished 状态的修改点才会列入正式版规范。

各个不同的修改点具有不同的状态,某些会稍快一些的走完流程,某些则耗时很久,还有很多修改点永远都不会进入最终阶段。

请注意这五个阶段中的 Draft (草案阶段)是对某一个 ES 规范修改点的状态描述,它和上一章节中 TC39 网站上的 ECMAScript® 2021 Language Specification 文档标题部分标注的「Draft ECMA-262」并不是一个意思。「Draft ECMA-262」中的 Draft 是在描述这个规范文档的状态,因为它其中包含了一些已经由 TC39 审议完成(Finished)但暂未由 Ecma International 正式批准发布的修改点,因此整篇规范文档夹杂着正式和非正式内容,所以只能称之为是 Draft。但是这个文档里面内容全都是已完成的,所以可以放心阅读

如何上手阅读?

ES 文档非常长,初次上手看起来会很头大。没关系,这么长的文档我们没必要全部看一遍。正确的姿势应当是带着问题来阅读,有针对性的查找你要搞明白的点。比如我想了解 Number.prototype.toString 的执行逻辑,它具体是如何运行的?请善用文档自带的搜索功能,事半功倍!打开 规范文档,在左上角有一个搜索框,搜索关键字 Number.prototype.toString,然后会自动跳出结果。

搜索

很显然,第一个 20.1.3.6 Number.prototype.toString ( [ radix ] ) 就是我们要找的内容,点击链接可直达该部分。

Number.prototype.toString

这段内容使用了文档的一些内部概念,光看这一段话,未必能够直接理解它的意思。比如其中涉及到规范的简写标记抽象操作等。本文的目的不在于直接解释 Number.prototype.toString 这个方法的具体逻辑,因为类似这样的内容太多无法一一描述,而且文档一直在更新,仅针对这些的零散知识点来讲解意义不大。

本文希望达到的目的是「授人以鱼,不如授人以渔」,即让大家学会如何理解规范文档,这样遇到问题时能够通过自己的力量解决。后续的文章,我会介绍 ECMAScript 规范中的一些重要概念,当你了解这些概念,阅读规范的难度会大大降低。


本文采用 CC BY-SA 4.0 协议(Creative Commons Attribution-ShareAlike 4.0 International License),具体参见地址 creativecommons.org/licenses/by… 。本文所引用的外部内容遵照它们各自原本的协议。


参考/引用材料