ECMAScript的新特性是怎么添加的?

261 阅读3分钟
作者:ZWR

我们熟练地使用{...arr} let\ constpromise等等已经行之有年,然后到后来的async-await等等,es的新特性每年都在增加,那么,这些特性是怎么加到es中来的呢?还有一个问题:我们什么时候可以使用它们?

1、在回答这两个问题之前,我们先熟悉一下ECMAScript, 这个现在比较粗略地理解为javascript, 只不过,它是javascript加入了ECMA国际组织后叫的名字。ECMAScript【简称es】是一个语言标准,而javascript是对这个语言标准的一种实现。
2、ES这个语言从es5后停顿了很长一段时间,直接我们前端猿熟知的es2015发布之后又重新活跃了起来,此后每一个,都会有一个版本发布,在原有的基础上增加一些新的特性,同时也采用了年份命名的方式。

那么,谁决定每年发布什么新特性的呢?

ECMA下面有一个技术委员会叫TC39,TC39 指的是技术委员会( Technical Committee )第 39 号,一个推动 JavaScript 发展的委员会。它是 ECMA 的一部分, ECMA 是 “ ECMAScript ” 规范下的 JavaScript 语言标准化的机构。

TC39 由各个主流浏览器厂商的代表构成,当然国内一些大型的科技公司比如阿里和字节都已经加入了 TC39 。他们的主要工作就是制定 ECMAScript 标准,标准生成的流程,并实现。毕竟需要他们来实现嘛,所以成员就钦定 了。
这个技术委员会每两个月就开一次会,然后写上会议记录,发布到github上,新语言的特性提案一般经历五个阶段,这五个阶段也都可以在github上面查看
对于一个提案从提出到最后被纳入 ES 新特性,TC39 的规范中有五步要走:

  • stage0(strawman ),任何 TC39 的成员都可以提交。
  • stage1(proposal ),进入此阶段就意味着这一提案被认为是正式 的了,需要对此提案的场景与 API 进行详尽的描述。
  • stage2(draft ),演进到这一阶段的提案如果能最终进入到标准,那么在之后的阶段都不会有太大的变化,因为理论上只接受增量修改。
  • state3(candidate ),这一阶段的提案只有在遇到了重大问题才会修改,规范文档需要被全面的完成。
  • state4(finished ),这一阶段的提案将会被纳入到 ES 每年发布的规范之中。

发布完之后呢?我们什么时候可以使用?

每年的es规范发布完之后,就等浏览器厂商和nodejs来实现,毕竟这两个是es的运行环境。【chrome和firefox是最积极的了,微软就...】如果不知道支不支持,我们可以通过caniuse来查询一下,比如一个新特性hasown.
假若,我们不知道用户用的什么浏览器,但又想用这些新特性怎么办?
答案是babel,它能帮你把代码转为兼容的版本。比如要用stage3的,可以通过这个插件帮忙
babeljs.io/docs/en/bab…
好吧,这里先不说怎么安装了,挑一些感觉工作中遇到的的提案出来分享一下:

一些新特性

  1. github.com/tc39/propos…
    stage3,顾名思义,这是一个从尾部查找数组元素的特性,举个栗子:
const array = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }];

array.find(n => n.value % 2 === 1); // { value: 1 }
array.findIndex(n => n.value % 2 === 1); // 0

// ======== Before the proposal =========== 

// find
[...array].reverse().find(n => n.value % 2 === 1); // { value: 3 }

// findIndex
array.length - 1 - [...array].reverse().findIndex(n => n.value % 2 === 1); // 2
array.length - 1 - [...array].reverse().findIndex(n => n.value === 42); // should be -1, but 4

// ======== In the proposal =========== 
// find
array.findLast(n => n.value % 2 === 1); // { value: 3 }

// findIndex
array.findLastIndex(n => n.value % 2 === 1); // 2
array.findLastIndex(n => n.value === 42); // -1

相似的,大家似乎对数组的查找比较感兴趣,逮住它就打,然后还有:数组最后一项,还有at()
2. github.com/tc39/propos…
stage1:判断数组相等的
3. github.com/tc39/propos…
stage4,可选链, 类似obj?.subObj?.a
更多的可以参考:
github.com/tc39/propos…