ECMAScript 相关的一些概念

前言

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

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

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

一些基本概念

  • ECMA : 的全称是 E uropean C omputer M anufacturers Association,即欧洲计算机制造商协会。后来发展成为一个国际性的标准化组织,专注于信息和通信技术领域。该组织的主要目标是评估、开发和推广各种技术标准,以促进全球信息技术和电信产业的兼容性和互操作性。

  • ECMAScript: 由 ECMA 国际通过 ECMA-262 标准化的脚本程序设计语言规范 。 当然还有其他ECMA标准 ECMA 国际组织 各种文案

    • ECMA-262:ECMAScript 规范
    • ECMA-402:国际化 API 规范
    • ECMA-404:JSON 数据交换语法。
      补充两句, ECMA-404 本质是一种文本语法。和对象字面量是有区别的,不过也不用可以在乎这些。
    • ECMA-414:规定了和 ECMAScript 相关的标准有哪些, 目前是ECMA-402,ECMA-404。
    • ECMA-334 : C# 语言规格的标准文档
    • ECMA-408 : Dart语言的标准规格文档(与Flutter相互成就)
    • ECMA-419:嵌入式系统 API 规范

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:

有同志会问题 ES4 呢? 该版本提案改动很激进。它应该引入了很多的新特性,如类、模块、迭代器和生成器,但是由于规模太大以及浏览器兼容性问题,最终没有被采纳。

ES1 到 ES5 的演进图,真版本也就是 ES1, ES3, ES5 如下:

ES2015 也就是 ES6, 同样的 ES2016 就是 ES7,往后推就行

ES2015 到 ES2024 的演进图

另外 tc39.es/ecma262/ 的文档是最精确且最新的 ECMAScript 规范。它还包含了Stage 4 阶段提案内容。

数字不好记, 按照年份也有对应的文档地址

本地阅读协议

线上版本都是需要联网的,可以把最新的文档下载本地,可以提高学习效率:

  1. 下载标准仓库 git clone https://github.com/tc39/ecma262
  1. 安装依赖 npm isntall
  2. 构建 npm run build
  3. 打开out目录下的index.html 即可离线阅读,nice

ECMAScript 协议落实流程

从上面的协议版本,可以得知 EACMScript 262协议本身是一直在更改迭代的。

从一个想法到完全规范化的功能遵循一个规范的流程, 即 The TC39 Process,这个过程共有六个阶段:初步草案阶段以及五个"成熟"阶段。

  1. Stage 0:初步想法阶段,提出一个概念或草案。
  2. Stage 1:正式提案阶段,明确表述提案。
  3. Stage 2:草案阶段,提案需有详细的规范、初始实现以及对现有生态影响的评估。
  4. Stage 2.7:通过测试和原型开发获得初步的特性经验。
  5. Stage 3:候选阶段,提案应当被大多数浏览器引擎实现,并在实际使用中进行测试。
  6. 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。

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加载远程的测试包,就可以开始测试了。

引用

Well-Known Intrinsic Objects

Additional Properties of the Global Object

D Host Layering Points

相关推荐
极客小俊35 分钟前
粘性定位Position:sticky属性是不是真的没用?
前端
云端看世界38 分钟前
ECMAScript 类型转换 下
前端·javascript
云端看世界40 分钟前
ECMAScript 运算符怪谈 下
前端·javascript
云端看世界41 分钟前
ECMAScript 函数对象实例化
前端·javascript
前端爆冲42 分钟前
基于vue和flex实现页面可配置组件顺序
前端·javascript·vue.js
云端看世界43 分钟前
ECMAScript 中的特异对象
前端·javascript
il1 小时前
Deepdive into Tanstack Query - 2.1 QueryClient 基础
前端
_十六1 小时前
看完就懂!用最简单的方式带你了解 TypeScript 编译器原理
前端·typescript
Komorebi_99991 小时前
Axios 是一个基于 Promise 的 HTTP 客户端,可用于浏览器和 Node.js 环境。以下是它的一些主要作用
javascript·ajax
云端看世界1 小时前
ECMAScript 运算符怪谈 上
前端·javascript·ecmascript 6