Node.js 0.12 中提供的 ECMAScript 6 功能

Posted

技术标签:

【中文标题】Node.js 0.12 中提供的 ECMAScript 6 功能【英文标题】:ECMAScript 6 features available in Node.js 0.12 【发布时间】:2015-04-07 23:02:01 【问题描述】:

Node.js (0.12) 的新稳定版本最近登陆了升级的 Google v8 javascript 引擎,v3.28.73

目前 Node.js 中存在哪些 ECMAScript 6 功能,但未使用 --harmony 标志?

我检查了几个声称列出 ES 6 功能的网站,但它们似乎都已过时 - 最突出的是 this table(更新: 现在已更新为当前的 Node.js从 0.12 开始的状态),因为其中一些功能被列为需要--harmony 标志,而我发现其中一些功能默认启用(地图、集合、符号等)。 更新:Node specific tables 现已提供

此外,试图通过谷歌搜索此信息纯粹是为了 v8 引擎提供了最新的信息 - 当前的 v8 版本是 4.2.*,这远远领先于 Node.js 使用的版本。

我希望这个问题(及其答案)将成为对 Node.js 开发人员现在可用的 ES 6 功能的全面总结。

我目前知道的 Node.js 0.12 中启用的 ES 6 功能:

地图、集合 / WeakMaps、WeakSets 符号 Object.observe 承诺 号码 .isInteger .isSafeInteger .isNaN .EPSILON .MIN_SAFE_INTEGER .MAX_SAFE_INTEGER 数学 .clz32 .imul .sign .log10 .log2 .log1p .expm1 .cosh .sinh .tanh .acosh .asinh .atanh .trunc .fround .cbrt .hypot

【问题讨论】:

“我希望这个问题(及其答案)将成为关于 Node.js 开发人员现在可以使用哪些 ES 6 功能的全面总结。” - 机会是不是它只会变得杂乱无章……就像所有其他资源一样过时!除非您 1)自我回答和 2)花时间将其他答案整理到您的答案中。如果您准备好做这项工作,那么在博客中做可能更合适。 或者直接切换到io.js(它附带了一个更新的V8版本)并密切关注ES6 on io.js page。 精选 ES6 兼容性表:kangax.github.io/compat-table/es6 @JonathanLonowski 很有趣,奇怪的是我找不到关于节点 0.12 的问题/公关。 编辑:提交了issue。 @RobertRossmann - 任何人都可以拥有博客。我不怀疑你的目标。只是我认为这不会奏效......除非有人(即>>你>努力 【参考方案1】:

不带--harmony 标志的功能:

"for-of" loop Map、Set、WeakMap、WeakSet(已在问题中指定) Symbol(已在问题中指定) Promise(已在问题中指定) 数组方法: .keys() .values() .entries() [Symbol.iterator] 对象: .observe()(最初是 planned for ES7,但在 2015 年 11 月 2 日是 removed from the spec entirely) .is() .setPrototypeOf() .getOwnPropertySymbols() .getNotifier()(不是es6,例如here) .apply() 和 .call()(不是 es6,与 Funciton.prototype.call 和 Function.prototype.apply 用途相同) 数字属性和方法(已在问题中指定) .isInteger() .isSafeInteger() .isNaN() .isFinite() EPSILON MIN_SAFE_INTEGER MAX_SAFE_INTEGER 数学方法 (a lot of them)(已在问题中指定) constants

我认为这就是没有--harmony 标志的所有内容。

带有--harmony 标志的功能:

generators arrow functions(与 io.js 相比,不需要 --harmony_arrow_functions 标志) let variables - 仅在 strict mode Binary and octal literals

字符串方法:

.contains()(在实际的 ES6 规范中被 includes() 取代) .startsWith() .endsWith() .codePointAt() .repeat() .normalize() String.fromCodePoint

Proxy(在--harmony-proxies 标志后面)

我想就是这样。也许如果我忘记了什么 - 我稍后会将它添加到列表中。

【讨论】:

这正是我希望得到的答案——干净,并带有文档/示例的链接!在--harmony 标志下列出功能的额外积分。:) 字符串模板是否有--harmony?如后面的勾号$varname 字符串语法? @Sukima Node v0.12 不支持template strings,也没有--harmony 标志,也没有它。但是iojs 无需任何标志即可支持它们。 nodejs 是否在任何地方都记录了这一点?非常有用。 @JonRed 也许您的运行因其他原因而失败,而不是因为常数。我刚刚尝试过,我的跑步效果很好。【参考方案2】:

ES6 功能分阶段渗透到 Node。 Node 使用 Google 的 V8 作为 JavaScript 引擎。 Node 支持的功能意味着它首先必须在 V8 中实现,然后 Node 团队必须将其合并到 Node.js 中。

Google 团队大约每六周发布一个新版本的 V8,然后由 Node 团队来使用它。

手动整理的语言功能列表很不错,但很快就会过时。 Node 0.12 不再是那种不断变化的版本,但通常在推出新版本的 Node 后,手动管理的列表就会过时。

这里有两种替代方法可以检查 Node 版本支持的功能,而不依赖于静态列表。如需进一步阅读和更详细的使用示例,您可以查看"How to check if Node.js supports ES 6 language feature"

#1 简单 - 兼容性表

动态生成的列表依赖于小测试来确认语言功能的存在,从而更好地保持最新状态。一个这样的流行列表是 kangax.github.io/compat-table/es6/。我们只对 Node 特性感兴趣,所以你可以使用

http://node.green

利用与 kangax 网站相同的数据。

#2 Hard - 回溯 V8 版本

Node 使用 V8 引擎,因此确定 Node 中包含的 V8 版本告诉我们支持哪些 ES6 语言特性。您可以通过node -p process.versions.v8 了解 Node 中捆绑了哪个版本的 V8。

$ node -p process.versions.v8
4.6.85.31

然后使用 Google 的 V8 项目资源,您可以找到每个版本中实现了哪些功能。 V8 项目保留了一个issue tracker,您可以在其中找到标有 harmony 标签的 ES6+beyond 功能。

【讨论】:

以上是关于Node.js 0.12 中提供的 ECMAScript 6 功能的主要内容,如果未能解决你的问题,请参考以下文章

2017,我们来聊聊 Node.js

我可以使用 node.js 获取唯一的服务器机器标识符吗?

Babel指南——基本环境搭建

使用 express.js 在 node.js 中提供 html 的最佳实践是啥?

node.js 可以在任何托管服务提供商中运行吗?

获取 API 未在 Node.js 中提供响应数据