ECMAScript标准制定过程展示及ES7新特性披露
liuian 2025-06-09 23:33 49 浏览
2015年6正式发布的ES6是ECMAScript的最新版本,它的发布具有里程碑意义,不仅带来了众多的新特性, 而且自此将改变ECMAScript的发布策略。本文将会介绍ECMAScript标准的最新制定过程, 并简要的介绍将会出现在ECMASCript 2016中的主要新特性。
基础知识
ES6作为ECMAScript的最新版本,在ES6发布的近6年后才被正式标准化(2009年12月 vs 2015年6月)。 导致这么长跨度的主要原因有两个:
- 所有的特性无论先后,都必须等待新的发行版本(release)完全制定完成后才能公布;
- 有些特性未能完全达成一致,从而造成了整个发行版本的延迟。如果这些特性推迟到下一个发行版本,那么将会耗费更多的时间。
为了避免这种缓慢的发行版本更新策略,从ECMAScript 2016(ES7)开始,版本的发布将会变得更加频繁, 这也意味着未来每个新的发行版本都会包含尽可能少的特性,而发行周期则缩短为1年,并且每年只发行确保一年期限内能够完成的所有特性。 为了向你简要的介绍新的版本发行策略,首先需要介绍的是TC39。
技术委员会39 (Technical Committee 39 - TC39)
TC39(ECMA技术委员为39)是推动JavaScript发展的委员会。 它的成员都是企业(主要是浏览器厂商)。TC39会定期的开会, 会议的主要成员是成员公司的代表,以及受邀请的专家。 你可以参考网络上的一个有关TC39会议的会议纪要来了解TC39是如何工作。
在本文中,通常我们用“TC39成员”这个术语来指代一个具体的人,他是由TC39成员公司所委派的会议代表。 有一点值得注意的是,TC39必须达成全员一致的协议:决策只有被所有的成员单位一致同意时才能被做出。
TC39的过程
针对ECMAScript特性的每一个提议都需要经历以下几个成熟阶段,从阶段0开始。从一个阶段递交到下一个阶段必须要收到TC39的全员同意。
Stage 0:strawman 稻草人
在该阶段可以自由的使用任意方式提交推动ECMAScript发展的想法。提议可以来自TC39成员单位,也可以是一个非成员单位, 但需要注册成为了TC39的贡献者。
条件:文档必须要在TC39会议上进行审核,然后将会被添加阶段0的建议页面中。
Stage 1:Proposal 提议
阶段1是对所提交特性的正式建议。
条件:必须要指派具体的人来负责该提议。该负责人或助理负责人必须是TC39的成员。该提议所解决的问题必须通过描述性的文档进行说明。 解决方法必须有例子、API,以及对语义和算法的讨论。最后,存在的潜在问题也必须要得到区分,例如与其他特性之间的关联,以及实现的难度。 Implementation-wise,polyfills和demos也都是必须的。
下一步:对于阶段1的提议的是否接受,TC39表明了其愿意检查、讨论和为提议做出贡献。继续向前,将会是提议的主要变化。
Stage 2:Draft 草案
阶段2是将会出现标准中的第一个版本。此时,将会与出现在标准中的最终特性是差不多的。
条件:此时建议必须要附加更规范化有关特性的语法和语意的说明(使用ECMAScript标准的正式语言)。 描述应该尽可能的完整,但也可以包含待办事项列表和占位符。该特性需要两个实验性的实现, 但其中一个可以在诸如Babel这样的转译器(transpiler)中。
下一步:从该改阶段只接收渐增的变化。
Stage 3:Canidate 候选
此时提议已经接近完成,只需要得到提议实现方的反馈,以及由用户来进一步推动。
条件:标准的文本必须是完备的。指定的审稿人(由TC39指派)和ECMAScript标准的编辑必须在该标准上签字。 必须要至少有两个符合标准的实现(可以不指定默认实现)。
下一步:至此之后,只有对实现和使用过程中出现的重大问题进行修正。
Stage 4:Finished 完成
提议将被包括到标准之中。
条件:在提议进入该阶段时需要满足以下的条件:
- Test 262验收测试(主要是用JavaScript代码编写的单元测试来验证语言特性);
- 两个通过测试的符合规范的装运实现(shipping implementations);
- 使用该实现的重要的实践经验;
- ECMAScript标准的编辑必须要签署该标准的文本;
下一步:该提议会被尽可能快的纳入到ECMAScript标准中。当标准通过长达一年的时间获得通过后,该提议将正式作为标准的其一部分。
不要称它们为ECMAScript 20xx特性
正如你看到的那样,只有到了阶段4,该特性才会被确定加入到标准中。然后会在下一次的ECMAScript发布中出现该提议, 当然也并非是百分百的,也可能需要更长的时间。因此,你不应该称提议为“ES7特性”或者“ES2016特性”等等。我通常喜欢的称法如下:
- ECMAScript建议:某特性。该建议所处的阶段应该在文章的一开始就被说明。
- ES.stage2: 某特性。
如果该提议几经进入阶段4,那么我会称他为ES20XX特性,当然最安全的做法是等到标准的编辑已经确认该下一个发布会包含该特性后才行。 例如Object.observe就是ECMAScript提议被进展到阶段2,却又最终被撤回的个例子。
ECMAScript Stage 3提议
下面这4个特性可能会出现在ECMAScript 2016中。
1. 指数操作符
该提议建议使用**操作符作为中缀来实现指数操作:
x ** y
产生的结果等同于
Math.pow(x, y)
例如:
let squared = 3 ** 2; // 9 let num = 3; num **= 2; console.log(num); // 9
进一步阅读可以参考:
2. Array.prototype.include
数组方法includes有以下的签名:
Array.prototype.includes(value : any) : boolean
如果value值是当前接收者(this)的元素的话则返回true,否则返回false:
> ['a', 'b', 'c'].includes('a');
ture
> ['a', 'b', 'c'].includes('d');
falseincludes与indexof类似——下面两个表达式几乎是相等的:
arr.includes(x) arr.indexOf(x) >= 0
唯一的区别是includes能发现NaN,而indexof不能:
> [NaN].includes(NaN) true > [NaN].indexOf(NaN) -1
includes并不会区分+0和-0(这也是JavaScript所一直表现的):
> [-0].includes(+0) true
有类型的数组也可以使用includes方法:
let tarr = Unit8Array.of(12, 5, 3); console.log(tarr.includes(5)); // true
常被问到的问题:
后者是最初的选择,但是对于Web而言会存在问题(MooTools向Array.prototype中增加了这个方法)
has用于键(Map.ptototype.has),includes用于元素(String.prototype.includes)。Set中的元素既可以看作是键和值, 这就是为什么在Set中有一个Set.prototype.has,而没有includes。
- ES6的方法String.prototype.includes用于字符串,而不是字符。这是否和Array.prototype.includes不一致?
如何数组的includes和字符串的includes工作模式一样的话,他将接收数组,而不是单个元素。但这两个includes都参照了indexof的例子, 字符可以看作为特殊的场景,而有固定长度的字符串则是更常见的场景。
进一步阅读:
3. SIMD.JS - SIMD APIs + Polyfill
SIMD代表的是“single instruction, multiple data(单指令多数据)”的意思,是CPU有能力将一个操作数应用于值向量(而不是单个值)。 SIMD指令集的一个流行的例子是SSE(Streaming SIMD Extensions),在被Intel处理器所支持。下面是一个简单的例子:
var a = SIMD.float32x4(1.0, 2.0, 3.0, 4.0); var b = SIMD.float32x4(5.0, 6.0, 7.0, 8.0); var c = SIMD.float32x4.add(a, b);
进一步阅读:
4. 异步函数
在这之前,如果我要介绍异步函数的话,肯定要解释如何使用Promise和生成器来使用类似于同步的代码执行异步操作。
使用Promise和生成器来编写异步代码:
对于那些需要异步的计算它们的一次性结果的函数而言,作为ES6一部分的Promise,正在变得越来越流行。 其中一个例子就是客户端的fetchAPI,它被设计用来取代XMLHttpRequest来获取文件。 它的使用代码大致如下:
function fetchJson(url) {
return fetch(url)
.then(request => request.next)
.then(text => {
return JSON.parse(text);
})
.catch(error => {
console.log(`ERROR: ${error.statck}`);
});
}
fetchJson('http://example.com/some_file.json')
.then(obj => console.log(obj));co是一个使用Promise和生成器来允许代码风格看起来更同步的库,但也需要使用类似于前面的例子那样的风格去编码:
const fetchJson = co(function * {
try {
let request = yield fetch(url);
let text = yield request.text;
return JSON.parse(text);
} catch (error) {
console.log(`ERROR: ${error.statck}`);
}
});每次回调函数(一个生成器函数)会向co产生一个Promise,回调函数被挂起。一旦Promise被安置好,co便恢复回调函数: 如果Promise被满足,yield便返回满足的值,如果被拒绝,yield便抛出异常。此外,co能够promise化回调函数所返回的结果。
异步函数
异步函数是执行类似co行为的专用语法:
async funtion fetchJson(url) {
try {
let request = await fetch(url);
let text = await request.text;
return JSON.parse(text);
} catch(error) {
console.log(`ERROR: ${error.statck}`);
}
}在内部,异步函数的工作非常类似于生成器,但它并不会被翻译为生成器代码:
变种
存在如下一些生成器函数的变种:
- 异步函数声明: async function foo { }
- 异步函数表达式:const foo = async function {};
- 异步方法定义:let obj = { async foo {} }
- 异步箭头函数:const foo = async => {}
进一步阅读
阅读材料
你可以阅读以下材料来深入的理解本文中涉及到的内容:
Github:ecma262,它包括:
TC39进度文档
其他阅读材料:
译者简介:景庄,前端工程师,关注Node.js、前端工程化。个人博客:http://wwsun.github.com。
相关推荐
- win10装机必备实用软件(win10电脑装机必备软件)
-
1、office大部分的版本如office2007、office2000、office2011、office2013、office2016、office365等都支持win10。2、需要注意...
- 迅雷无法下载的链接用什么下载
-
1.可以使用其他下载工具代替迅雷。2.迅雷可能无法下载的原因有很多,比如网络问题、软件故障等。其他下载工具可以提供类似的功能,但可能具有更好的稳定性和兼容性。3.一些常见的替代迅雷的下载工具包括...
- apple官方网站(apple官方网站旗舰店)
-
1、首先打开浏览器,输入https://www.apple.com/;2、即可浏览苹果官网。 苹果公司(AppleInc.)是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(R...
- 哪些手机用鸿蒙系统(都什么手机能用鸿蒙系统)
-
截至目前,国内有以下几款手机品牌可以装鸿蒙系统:1.华为:华为Mate40系列、P40系列、Mate30系列、MatePadPro系列等。2.荣耀:荣耀V40、荣耀30系列、荣耀X10系列等...
- 手机u盘读不出来了怎么修复(手机u盘读取不出来)
-
1、手机不支持OTG功能,所以将U盘连接到手机后,手机无法识别U盘的内容,因此显示不了;这种情况只能换台支持OTG功能的手机来连接U盘才行。2、手机支持OTG功能,但是使用的OTG线质量有问题导致无法...
- 笔记本散热器买哪种好(笔记本散热器买哪种好贴吧)
-
散热器有十大品牌:九州风神、超频三,酷冷至尊Tt、AVC、思民、捷冷、安钛克Antec、安耐美Enermax、海盗船Corsair。能位列十大品牌,每一种的质量和功能都有保障。、目前网上销量最高的是九...
-
- 打印机驱动一直安装失败(打印机驱动一直安装失败怎么办)
-
打印机驱动程序安装失败需要对电脑进行其他设置,详细步骤如下:1,在电脑桌面上找到【计算机】并用鼠标右击。2,右击后在出现的选项中找到【管理】选项并点击打开。3,接下里会进入到计算机控制台界面,在这里要根据自己的电脑选择64位或者32位,选择...
-
2026-01-14 12:55 liuian
- ctrl加谁是截图(ctrl和什么键可以截图)
-
第一种:Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片第二种:Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片第三种:打开qq,使用快捷键Ctrl+...
- 技嘉主板bios设置启动顺序(技嘉主板bios设置启动顺序怎么设置)
-
启动顺序设置方法如下:1、重启电脑连续按[DEL]键进入BIOS设置,按DEL进入BIOS设置。2、按键盘方向键右键切换到BOOT选项,将windows10功能设置为"其它操作系统"...
-
- 目前台式电脑主机怎么选(台式主机选择)
-
每个人对电脑的性需要不同,因此根据自己家的家庭需要,选择合适的电脑即可。以下简单说明:1,双核处理器+2G内存+集成显卡+机械硬盘。性能满足上网、看电影、聊天、办公、玩象棋之类的小游戏。价格在2000以内可以买到;2,四核处理器+4G内存+...
-
2026-01-14 12:05 liuian
- 台式电脑如何用u盘重装系统(台式电脑如何用u盘重装系统应用)
-
1、重启电脑并进入BIOS;2、在BIOS中设置启动顺序,优先从U盘启动;3、从U盘启动,进入安装界面;4、选择安装语言、时区和键盘设置;5、选择安装方式,一般选择“清除整个硬盘并安装”;6、配置分区...
-
- stop0x0000007b蓝屏(stop0X0000007b蓝屏,修改注册表)
-
步骤/方式1将电脑送到当地的维修店步骤/方式2然后将师傅维修一下蓝屏的问题当电脑启动蓝屏出现错误代码0x0000007b时,首先我们将电脑重启,在开机时不停按启动热键进入到bios设置页面,进入页面后找到“IntegratedPeriphe...
-
2026-01-14 11:21 liuian
- 怎样设置默认打印机(打印机设置彩色打印在哪里设置)
-
步骤如下:1.单击Windows“开始”菜单,指向“设置”,单击“打印机”,打开“打印机”窗口。2.右键单击打印机图标,系统弹出快速菜单,单击其中的“设为默认值”。如果“打印机”窗口没有当前使用的打印...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
