如何读 ECMAScript 规范(一)

  1. 如何读 ECMAScript 规范(一)
    1. 参考
      1. 我为什么读这个规范
      2. 哪些属于 or 不属于 ECMAScript 规范
      3. ECMAScript 规范在哪
      4. 导航
    2. 运行时语义

如何读 ECMAScript 规范(一)

参考

本文翻译自:

https://timothygu.me/es-howto/

在本文档中,我将仅使用术语 “ECMAScript” 来指代规范本身,而使用 “JavaScript” 来指代其他任何地方。但是,这两个术语都指同一事物。(ECMAScript 和 JavaScript 之间有一些历史上的区别,但讨论这超出了本文档的范围,你可以很容易地用谷歌搜索这种区别。

我为什么读这个规范

ECMAScript 规范是所有 JavaScript 实现行为的权威来源,无论是在浏览器中,还是在服务器 Node.js,还是在 IoT 设备上。

JavaScript 引擎的所有开发人员都依赖于规范来确保其闪亮的新功能按预期工作,就像其他 JavaScript 引擎一样。

假设有一天在工作中发现了以下奇特的代码:

> Array.prototype.push(42)
1
> Array.prototype
[ 42 ]
> Array.isArray(Array.prototype)
true
> Set.prototype.add(42)
TypeError: Method Set.prototype.add called on incompatible receiver #<Set>
    at Set.add (<anonymous>)
> Set.prototype
Set {}

为什么 Array 的原型上的 push 方法是可以直接调用的。而 Set 不行?

不幸的是,Google 总是在你最需要的时候失败,一直有用的 Stack Overflow 也是如此。

读规范可以解决。

或者,您可能想知道臭名昭着的松散相等运算符 == 实际上是如何运作的。勤奋的你在 MDN 上查找它,却发现它的解释段落给你带来的伤害比帮助更大。

另一方面,我不建议刚接触 JavaScript 的开发人员阅读 ECMAScript 规范。如果你是 JavaScript 的新手,那么就试试 Web 吧!

当你经历过足够多的 JavaScript 问题,不必担心 JavaScript 时,请考虑返回到本文档。

哪些属于 or 不属于 ECMAScript 规范

描述 分类
句法元素的语法(即,有效的 for 循环应该是什么样) 属于规范✔
句法元素的语义(例如,typeof null 应该返回什么,{ a:b } 应该返回什么 属于规范✔
Object, Array, Function, Number, Math, RegExp, Proxy, Map, Promise, ArrayBuffer, Uint8Array, globalThis, … 属于规范✔
import a from 'a'; 规范指定了此类声明的语法以及它们的含义,
但没有指定具体如何加载模块。
console, setTimeout(), setInterval(), clearTimeout(), clearInterval() 这些方法在浏览器端和 Node 里都可用,但是属于非标准。
对于 Node,他们属于 Node 规范。对于浏览器,console 被 CONSOLE 标准规范,其余被 HTML 标准规范。
Buffer, process, global* 属于 Node 规范。
module, exports, require(), __dirname, __filename 这些是 Node.js 模块范围的 “全局变量”,由其文档记录
window, alert(), confirm(), DOM (document, HTMLElement, addEventListener(), Worker, …) 只在浏览器存在

ECMAScript 规范在哪

[ECMA-262](https://tc39.es/ecma262/)

导航

ECMA 包含巨量信息。尽管作者尽力分隔成单独的部分,但是仍然是巨量。

个人把规范分为五部分:

  • 约定和基础知识(什么是 Number?“throw a TypeError exception”是什么意思?)
  • 语法(如何编写 for-in 循环?)
  • 语言的静态语义(变量名称是如何在 var 语句中确定的?)
  • 语言的运行时语义(for-in 循环是如何执行的?)
  • API(String.prototype.substring() 做了什么?)

然而 ECMA 规范没有安装上面的划分。

第 1 部分在 CH5 Notational ConventionCH9 Ordinary and Exotic Objects Behaviours

第 2,3,4 部分以交错的形式在CH10 ECMAScript Language: Source CodeCH15 ECMAScript Language: Scripts and Modules

我想指出的是,绝对没有人从上到下阅读规范。

相反,只查看与您尝试查找的内容相对应的部分,并且在该部分中仅查看您需要的内容。尝试确定您的具体问题与五大部分中的哪一个相关; 如果你在确定它是哪一个时遇到困难,问问自己一个问题:”这个(无论你试图确认什么)在什么时候被评估?” 这可能会有所帮助。别担心,通过练习,导航规范只会变得更容易。

运行时语义

下部分。。。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。
我的空间