89

我刚开始使用 Node.js,我很难弄清楚 node 支持什么版本的 JavaScript,这使得我很难弄清楚我可以使用哪些功能。这就是我所知道的。

鉴于此,我假设我可以在 node.js 中使用与 JavaScript 1.5 兼容的代码。然而,事实证明,我可以使用Array.forEach,以及其他构造,尽管根据 MDC,它直到 Javascript 1.6 -- ECMA-262,第 5 版才可用。

我哪里错了?某处是否有详细说明可用语言功能的文档?

4

5 回答 5

38

这个矩阵(V8 非常接近 WebKit 专栏)似乎很好地回答了“我可以使用哪些功能?”这个问题。但我找不到“支持什么版本的 javascript?”的规范答案。据我所知,最好的答案是:支持 ECMA-262 第 3 版,但也支持第 5 版的许多功能。

有一个很好的解释为什么 V8 在这个线程上遵循 WebKit 和 JavaScriptCore 功能。

于 2011-02-28T07:30:44.803 回答
33

Node javascript 版本取决于 Node 使用的 v8 版本。节点版本 0.5.1(2011 年 7 月 14 日)及更高版本使用 v8 3.4.10 或更高版本,并且是第 5 版 ECMA-262,而不是第 3 版。第 5 版相当于 Javascript 1.8.5。看下面的原因。

在 2011 年 5 月 21 日至 2011 年 6 月 15 日期间,v8 网站停止将 v8 列为实施第 3 版 ECMA-262 并开始显示第 5 版。 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 版。所以那个版本及以后的版本是第5版。

根据 Node 更新日志,v8 3.4.10 位于 Node 版本 0.5.1,2011 年 7 月 14 日,因此该版本及更高版本是第 5 版 ECMA-26。这并不意味着 3.4.10 之前的 v8 版本纯粹是第 3 版,因为通过许多 v8 版本可能已经从第 3 版稳定过渡到第 5 版。

于 2012-04-12T20:27:05.900 回答
26

看起来,在某些时候,创建了node.green来跟踪针对不同 Node 版本的 JavaScript 功能支持。

于 2016-08-08T14:49:24.660 回答
2

似乎我们已经简化为两种策略来确定使用哪个版本的 Javascript 节点:

策略 1:相信某处的某个文件所说的内容,这在很多情况下是错误的。我还没有找到指示哪个版本的节点支持哪个版本的 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

我想这里的“通天塔”是指塔纳赫。我们的节点版本支持哪些功能?嗯,我不知道,你必须手动测试它。这将成为一个巨大的混乱。更糟糕的是,这似乎是故意的。

于 2015-10-22T19:47:04.870 回答
1

这是V8 团队在 2016 年发表的一篇博文,解释了为什么这是一团糟,尤其是自 2016 年 TC39 开始更频繁地发布新的 JavaScript / ECMAScript 规范以来。

如果您使用 Visual Studio Code(或任何使用 Language Server/LSP 的编辑器),则编译目标的有效值包括es2015(aka es6) 和es2016.

我能找到的唯一解决方法是知道我的 Node 版本是否支持给定版本的 JavaScript,如下所示:

  1. node -p process.versions.v8通过运行或通过节点文档在该特定节点中查找 V8 版本
  2. 通过Wikipedia查找哪个版本的 Chrome 对应于该 V8 版本
  3. 转到上面 V8 博客文章中提到的Kangax 兼容性表,并检查该版本的 Chrome 支持哪些功能/JavaScript 版本

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

于 2021-12-30T11:48:20.057 回答