2011-02-28 171 views
60

我开始使用Node.js,并且很难弄清楚哪个版本的JavaScript受节点支持,这使得难以弄清楚我可以使用哪些功能使用。这是我所知道的。Node.js支持哪些版本的Javascript

  • Node使用V8
  • V8在ECMA-262,第三版指定执行的ECMAScript
  • ECMA - 262,第三版是JavaScript 1.5

考虑到这一点,我会承担我可以使用节点中的JavaScript 1.5兼容代码。然而,事实证明我可以使用Array.forEach以及其他构造,尽管根据MDC它不可用,直到Javascript 1.6 - ECMA-262,第5版。

我哪里错了?是否有文档详述可用的语言功能?

+0

对于2015年更新,请参见[Node.js 0.12中提供的ECMAScript 6功能](http://stackoverflow.com/questions/28388885/ecmascript-6-features-available-in-node-js-0-12 )。 – 2015-08-01 01:14:52

+0

而一个05.2016更新,根据[文档的NodeJS(https://nodejs.org/en/docs/es6/),它们遵循[JavaScript的ECMA-262规范,第6版](HTTP://www.ecma- international.org/publications/standards/Ecma-262.htm)和“所有ECMAScript 2015(ES6)功能分为三组,用于发货,上演和正在进行的功能” – 2016-05-18 09:15:30

回答

29

This matrix(V8紧跟WebKit专栏)似乎很好地回答了“我可以使用哪些功能?”这个问题。但是我找不到“JavaScript支持哪个版本”的规范答案?据我所知,最好的答案是这样的:支持ECMA-262第3版,但第5版的许多功能也被支持。

对于为什么V8遵循this thread上的WebKit和JavaScriptCore功能有个很好的解释。

30

节点JavaScript版本取决于节点使用哪个版本的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的changelog,在2011年6月15日第8版改为版本3.4.4。所以那个版本和更高版本是第5版。

根据Node changelog,v8 3.4.10在2011年7月14日的Node Version 0.5.1中,因此版本及更高版本是第5版ECMA-26。这并不意味着3.4.10之前的v8版本纯粹是第3版,因为从第3版到第5版可能会有许多v8版本的稳定过渡。

+0

好吧,尽管V8正在切换到第5版没有证据表明Node完全在0.5.1+版本中完全遵守它。我的0.6.12不支持Object.prototype.getOwnPropertyNames()尽管它在ECMA262-5th 15.2.3.4的上市。 – soletan 2012-08-19 10:50:22

+1

必须解决我之前的评论,因为上述方法是静态的,而不是绑定到Object.protoype(确实包含在节点0.6.12中),因此没有证据表明NodeJS不完全支持ECMA262-5th ... – soletan 2012-08-22 22:34:37

1

这好像我们已经减少到两种策略来找出哪些节点的Javascript的版本使用:

策略1:信任哪些文件的地方说,这是错误在许多情况下。我还没有找到表格,指出哪个版本的节点支持哪个版本的ECMAScript的键值对。

策略2:猜测和检查。

查找ES6报价,“看它是否失败”的一个例子,是这样的:

[email protected]:~/code$ echo "console.log('blue'.includes('blue'))" > a.js 
[email protected]:~/code$ cat a.js 
console.log('blue'.includes('blue')) 
[email protected]:~/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 
[email protected]:~/code$ babel-node a.js 
true 

我想的“巴别塔”在这里是对塔纳赫参考。我们的节点版本支持哪些功能?那么,我不知道,你必须手动测试它。这将成为一个巨大的MESS。更糟糕的是,这似乎是故意的。

5

的样子,在某些时候,node.green创建以跟踪不同节点版本的JavaScript功能的支持。