Node.js支持哪个版本的JavaScript?

98

我正在学习Node.js,但是很难确定Node支持哪个版本的JavaScript,这使我很难确定可以使用哪些功能。以下是我的了解:

  • Node 使用V8引擎
  • V8 实现了ECMA-262第3版规范的ECMAScript
  • ECMA-262第3版对应JavaScript 1.5版本 (参见维基百科)

基于这些信息,我认为可以在Node中使用与JavaScript 1.5兼容的代码。但是,实际上我可以使用Array.forEach等构造函数,尽管根据MDC文档,它直到JavaScript 1.6(即ECMA-262第5版)才被引入。

我错在哪里?是否有一份详细列出可用语言功能的文档?


有关2015年的更新,请参见Node.js 0.12中可用的ECMAScript 6功能 - Dan Dascalescu
根据nodejs文档的2016年5月更新,他们遵循JavaScript ECMA-262规范第六版,并且“所有ECMAScript 2015(ES6)功能被分为三个组:已发布、分阶段和正在进行中的功能”。 - Petar Donchev Marinov
ECMA-262是ECMAScript 5.1,也就是Javascript 1.8.5,详见(向下滚动至规范):https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty - Codebeat
这不是官方的 Node 文档,但 TypeScript Wiki 建议 使用稳定版本的 Node:https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping - Capi Etheriel
5个回答

39

这个矩阵(V8引擎紧随WebKit列),似乎相当好地回答了“我可以使用哪些功能?”的问题,但我找不到一个权威的答案来回答“支持哪个版本的JavaScript?”。据我所知,最好的答案是:支持ECMA-262第3版,但也支持第5版的许多功能。

这个主题提供了关于为什么V8引擎跟随WebKit和JavaScriptCore功能的良好解释。


4
2020年更新:请查看Nate Whittaker的答案 - rinogo
维基页面已被删除。 - Ooker

36

看起来,某个时候创建了node.green用于跟踪不同Node版本的JavaScript特性支持情况。


3
我在这里添加一个注释,因为表面上看,node.green 只列出了对 ES 2015 的支持。您可以通过编辑 URL 来进行调整,例如 https://node.green/#ES2018,它显示对 ES9 的支持,我相信。https://www.ecma-international.org/publications-and-standards/standards/ecma-262/ - Drazisil
也许我不知道如何操作,但对我来说这太令人困惑了。我只需要回答“这个Node版本使用的是哪个ES版本”,而我得到的却是每个Node版本支持的功能。 - Ooker

33

Node.js的Javascript版本取决于Node使用的v8版本。从Node版本0.5.1(2011年7月14日)开始,使用v8 3.4.10或更高版本,并采用第五版ECMA-262标准,而不是第三版。第五版等效于Javascript 1.8.5。原因如下。

2011年5月21日至6月15日期间,v8网站停止将v8标识为实现第三版ECMA-262标准,开始显示第五版。 http://web.archive.org/web/20110521053630/http://code.google.com/p/v8/ http://web.archive.org/web/20110615102350/http://code.google.com/p/v8/

根据v8变更日志,在2011年6月15日,v8更新到了3.4.4版本。此版本及以后的版本均采用第五版标准。

根据Node的变更日志,在Node版本0.5.1(2011年7月14日)中使用了v8 3.4.10版本,因此该版本及以后的版本均采用第五版ECMA-262标准。这并不意味着在3.4.10之前的v8版本完全采用第三版,因为可能有一个从第三版向第五版的平稳过渡。


尽管V8正在转向第5版,但在0.5.1+版本中没有证据表明Node完全遵守它。我的0.6.12虽然在ECMA262-5th 15.2.3.4中列出了Object.prototype.getOwnPropertyNames(),但它不支持它。 - soletan
1
我需要修正之前的评论,因为提到的方法是静态的,而不是绑定到Object.protoype上的(这确实包含在node 0.6.12中),因此没有证据表明NodeJS不完全支持ECMA262-5th... - soletan

3
这里有一篇来自V8团队的2016年博客文章,解释了为什么这是一场混乱,特别是自从TC39开始更频繁地发布新的JavaScript / ECMAScript规范以来。
如果您使用Visual Studio Code(或任何使用Language Server / LSP的编辑器),则编译目标的有效值包括诸如es2015(又名es6)和es2016之类的内容。
我能找到的唯一解决方案来确定我的Node版本是否支持给定的JavaScript版本是这样的:
  1. 通过运行 node -p process.versions.v8 或通过 Node 文档 找到该特定 Node 中的 V8 版本。
  2. 通过 维基百科 找到对应于该 V8 版本的 Chrome 版本。
  3. 前往上面提到的 V8 博客文章中提到的 Kangax 兼容性表,检查该版本的 Chrome 支持哪些功能 / JavaScript 版本。

结果是当前 Node LTS(16.13.1)包括 V8 9.4,支持所有 ECMAScript 2022 功能。


2
似乎我们只有两种策略来确定Node使用哪个版本的Javascript:
策略1:相信某些文档中的内容,但这在很多情况下都是错误的。我没有找到表格,可以指示哪个版本的Node支持哪个版本的ECMAScript。
策略2:猜测和检查。
找到ES6引用的功能,并“看看它是否失败”,就像这样:
el@apollo:~/code$ echo "console.log('blue'.includes('blue'))" > a.js
el@apollo:~/code$ cat a.js 
console.log('blue'.includes('blue'))
el@apollo:~/code$ node a.js
/home/el/code/javascript/02/a.js:1
ports, require, module, __filename, __dirname) { console.log('blue'.includes('
                                                                    ^
TypeError: undefined is not a function
    at Object.<anonymous> (/home/el/code/javascript/02/a.js:1:82)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3
el@apollo:~/code$ babel-node a.js
true

我猜这里的“巴别塔”是指《旧约圣经》中的故事。我们的node版本支持哪些功能呢?嗯,我不知道,你需要手动测试一下。这将变得非常混乱。更糟糕的是,似乎是故意这样设计的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接