tc39和ECMAScript

166 阅读8分钟

一、从 JavaScript 到 ECMAScript ,发生了什么

起因

JavaScript是1995年由网景(Netscape)公司开发的脚本语言,之后微软为他们的浏览器开发了JScript脚本,二者语法不同,规范不同,给开发者造成了困难

**解决方案
******1996年网景公司将 JavaScript 交给国际标准化组织 ECMA,由第三方来统一制定浏览器脚本语言的标准

结果

****1997年 ECMA 发布262号标准文件ECMA-262的第一版,将JavaScript语言的规范称为ECMAScript

JavaScript是ECMAScript标准的实现

为什么该脚本的标准规范不叫 ‘JavaScript Standards’

曾预想名字: LiveScript、ScriptJ、EZScript、Xpresso / Expresso / Espresso
1、javascript已经被sun公司注册为商标,授权给了netscape
2、体现这门语言规定的制定者是中立的

ECMA: European Computer Manufactures Association

二、ECMAScript

ECMAScript是纯粹的计算型编程语言,包括语法元素的语法定义,语意定义,内置的方法例程

ECMAScript特点

    • ECMAScript 简称 ES
    • ES 是 JavaScript 的标准化规范。
    • ES 只提供最基本的语法
    • JS引擎实现了 ES 标准,在此基础上宿主环境进行拓展,比如 DOM、BOM、读写文件等。

ECMAScript的标准组成部分

1、ECMA-262: ECMAScript 语言规范(ECMAScript Language Specification)
2、ECMA-402:ECMAScript 国际化 API 规范(ECMAScript Internationalization API specification)
tc39.es/ecma402/
tc39.es/ecma262/

javascript的20年

cn.history.js.org/part-2.html…

三、ECMAScript的主要迭代版本

github.com/tc39/propos…

ECMAScript的版本称呼
1、按照发布年份:比如ES2015表示2015年发布
2、按照迭代次数:ES6 表示这是第6次迭代

ECMA-262第1版

跟网景的JavaScript 1.1相同,删除了宿主的内置库代码,外加少量细微的修改。

ECMA-262第3版

更新了字符串处理、错误定义和数值输出,增加了正则表达式、新的控制语句、try/catch异常处理的支持。

ECMA-262第4版

几乎重新定义了该语言,包括强类型变量、新语句和数据结构、真正的类和经典的继承,在正式发布之前被放弃。(actionscript的兴起导致了一系列激进的改变)

ECMA-262第6版

也是ES6、ES2015,支持了class、块语句、新的数组方法、箭头函数、promise、代理和新的数据类型

ECMA-262第8版

也称为ES8、ES2017

async/await

object.values/object.keys

SharedArrayBuffer

Atomics API

Object.values()

Object.entries()

Object.getOwnPropertyDescriptors()

字符串填充方法

支持对象字面量最后的逗号

ECMA-262第9版

也称为ES9、ES2018

异步迭代

await readLines(filePath))

for of

for await (const line of readLines(filePath)) { console.log(line); }

rescure和对象展开

正则表达式后向断言

****(?<=...) 肯定后向断言;(?<!...):否定后向断言 (左)

(?=...) 肯定前向断言;(?!...) :否定前向断言(右)

Promise.prototype.finally

ECMA-262第10版

也称为ES10、ES2019

Array.prototype.flat()/flatMap()

****String.prototype.trimStart()/trimEnd()

**Object.fromEntries()
******obj = Object.fromEntries([['a', 0], ['b', 1]]); // { a: 0, b: 1 }

****Symbol.prototype.description

****Function.prototype.toString()修订

****确保字符串的解析包含与原始解析相同的函数体和参数列表

try{}catch{}: catch可选捕获err

ECMA-262第11版

也是ES11、ES2020,增加了

Promise.allSettled([]):不提前返回,等待所有结果给then

import.meta

**空合并运算符obj.key??'1'
**运算符左侧的表达式??计算结果为undefinedor null,则返回其右侧

BigInt 大与2^53

string.matchAll

import()

for..in..

可选链obj.a?.x

ECMA-262第12版

也称为ES12、ES2021

****数字分隔符:124_345_456

****逻辑赋值操作符: ??=, &&=, ||=

****String.prototype.replaceAll

****WeakRefs;WeakRef.prototype.deref ( )

****WeakRef 弱引用,可以引用对象,不会阻止该对象被垃圾回收

****Promise.any([])

ECMA-262第13版

也称为ES13、ES2022

错误原因:

new Error('err',{cause:err})

class 静态代码块、静态属性

[Array、String、TypedArray].at(index)

返回指定索引的元素支持负数索引

增加了顶层 await

**Object.hasOwn(obj, "key")
**Object.prototype.hasOwnProperty的简化

对象的私有属性判断 key in obj

正则表达式匹配索引

类私有属性、私有方法、静态属性,静态方法,静态私有方法

ECMA-262第14版:

也称为ES14、ES2023

按副本修改数组:

arr.toReversed()

arr.toSorted(compareFn)

arr.toSpliced(start, deleteCount, ...items)

arr.with(index, value) //替换数组元素

WeakMap支持Symboy作为key
Hashbang语法 #!/usr/bin/env node********

数组从尾部开始查找:

arr.findLast()、arr.findLastIndex()

四、谁来负责ECMAScript的更新迭代

Ecma TC39 委员会负责发展 ECMAScript 编程语言并编写规范;

TC39是 Ecma international 组织下的技术委员会之一,该委员会以协商一致方式运作,并有权酌情更改其认为合适的规范

TC39的组成人员

各大浏览器公司的代表、各大商业网站代表、各种库和框架的开发人、从事js教育的代表、主席团邀请的专家或者社区工作者

比如:google、microsoft、facebook、alibaba group、tencent、iphone、byte dance、huawei、babel开发者、TS开发者等等

ECMAScript 迭代周期

以年为单位将 ECMAScript 的更新封板发布

发布以前,各大浏览器都会提供新特性的实验性支持

ECMAScript 的发布类型 1、Editorial Changes: issues里大多是此类问题

较小的变更,不会影响规范,由编辑者小组去评审这些pull request。如改变构建流程,ci测试文件,规 范和标准的表达修改,

2、Normative Changes

规范上的变更,改变js运行和工作模式,改变js一小部分能力

面向社区收集反馈,这些变更将向社区去讲解,需要社区证实其效果

3、proposals重大变更

TC39 愿意接受 ECMAScript 的新功能请求,称为“提案”

提案由编辑和champions们,严格的按照stage流程进行

stage process: stage 流程

reviewers:审核

consensus:讨论

stage

ES的更改迭代需要经历一个过程

这个过程是一个【把一个想法转变为的ES正式功能】的指南

这个过程包括五个阶段: tc39.es/process-doc…

stage0: StrawPerson “稻草人”

任何未作为正式提案提交的讨论、想法或提案均被视为“稻草人”
这个阶段提案只是一个想法

stage1: Proposal 提案阶段
champion在委员会中讲解和介绍
表明这是一个值得讨论的议题
stage2: draft 草稿阶段

讨论具体的语法和语义的细节

stage3: candidate 候选阶段

收集具体实现者和用户的反馈

将会有不同的js引擎来实现此特性

第 3 阶段的共识意味着“解决方案已完成”(即所有开放设计问题已得到解决,包括预期的实施和生态

系统兼容性问题)

stage4: Finished

已满足第 4 阶段验收标准的第 3 阶段提案不得被拒绝推进,除非提出的问题与实施经验有关或确定了

委员会之前未讨论过的问题或信息

本次特性被至少两个js引擎实现,具体的测试已通过,表示可以被使用

提案的标准和规范将会进入主要的标准规范中

TC39的工作时间

每季度一次会议,之间穿插小会议

ECMA-402月度会议

每年 7 月向 ECMA 大会提交一份规范供批准。

生成新规范修订版的大致时间表:

      • 2 月 1 日:产生候选草案。
      • 2 月至 3 月:60 天免版税选择退出期。
      • 3 月 TC39 会议:合并第 4 阶段提案,批准最终语义,并从 master 分支出新的规范版本。从此时起,仅接受编辑更改。
      • 4 月至 6 月:ECMA CC 和 ECMA GA 审核期。
      • 7 月:ECMA 大会批准新标准
达成共识的技巧

****代表们尽早地提出担忧以及问题;

代表们对stage晋级提出限制或约束;

记录提案未通过的原因;

不违反stage阶段的约束;

持异议的代表和 champion 应共同努力解决问题;

严重问题需要对提案进行重大修改;

champions 做出改变并回来寻求共识;

不投票;
解决问题,决策讨论达成一致;

不在没有准备好的阶段将标准落地;

如何参与提案

gitHub的issues板块参与提案,招募 TC39 成员来帮助将您的请求转化为提案并将其转化为该语言

在MDN贡献文档

去论坛参与讨论

创建pull request

你所在的公司成为国际化组织的会员

可以和tc39主席团联系,被邀请参与

倡导者Champions的责任范围

委员会采用一种名为「倡导者模型」的开发方式。由一位或一小组成员共同对一项单独的特性负责。

倡导者(champion)需要写出最初的稻草人提案

champion 负责提案从第 0 阶段到第 4 阶段的演变

champion在提案存储库中拥有管理员权限,并且可以在此存储库中自由进行更改

champion可以定期向 TC39 提出他们的提案,以寻求就阶段进展达成共识

champion定期向委员会通报最新状态并解释重大变化。

参考文档

developer.mozilla.org/en-US/docs/…

tc39.es/

github.com/tc39/propos…

jscig.github.io/#

github.com/75team/tc39

tc39.es/ecma402/
tc39.es/ecma262/

developer.mozilla.org/zh-CN/docs/…

github.com/tc39/ecma26…

tc39.es/process-doc…