一、从 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的主要迭代版本
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/ecma402/
tc39.es/ecma262/