Welche Version von Javascript wird in node.js unterstützt?


81

Ich fange mit Node.js an und habe Schwierigkeiten herauszufinden, welche JavaScript-Version von Node unterstützt wird, was es schwierig macht, herauszufinden, welche Funktionen ich verwenden kann. Folgendes weiß ich.

  • Knoten verwendet V8
  • V8 implementiert ECMAScript gemäß ECMA-262, 3. Ausgabe
  • ECMA-262, 3. Ausgabe ist JavaScript 1.5

Vor diesem Hintergrund würde ich davon ausgehen, dass ich JavaScript 1.5-kompatiblen Code im Knoten verwenden kann. Es stellt sich jedoch heraus, dass ich das Array.forEachunter anderem verwenden kann, obwohl es laut MDC erst in Javascript 1.6 - ECMA-262, 5. Ausgabe, verfügbar ist.

Wo gehe ich falsch? Gibt es irgendwo ein Dokument, in dem die verfügbaren Sprachfunktionen aufgeführt sind?


Ein Update für 2015 finden Sie unter ECMAScript 6-Funktionen in Node.js 0.12 .
Dan Dascalescu

Und ein Update vom 05.2016, gemäß den Dokumenten von nodejs , folgt der JavaScript ECMA-262-Spezifikation, 6. Ausgabe und "Alle ECMAScript 2015 (ES6) -Funktionen sind in drei Gruppen für Versand-, inszenierte und laufende Funktionen unterteilt"
Petar Donchev Marinov,

ECMA-262 ist ECMAScript 5.1 ist Javascript 1.8.5, siehe auch (scrollen Sie nach unten zu den Spezifikationen): developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Codebeat

Antworten:


37

Diese Matrix (V8 folgt ziemlich genau der WebKit-Spalte) scheint die Frage "Welche Funktionen kann ich verwenden?" Ziemlich gut zu beantworten. Ich kann jedoch keine kanonische Antwort auf "Welche Version von Javascript wird unterstützt?" finden. Soweit ich das beurteilen kann, lautet die beste Antwort: ECMA-262 3rd Edition wird unterstützt, aber viele Funktionen der 5th Edition werden ebenfalls unterstützt.

Es gibt eine gute Erklärung dafür, warum V8 die WebKit- und JavaScriptCore-Funktionen in diesem Thread befolgt .


1
Update 2020: Siehe die Antwort von Nate Whittaker .
Rinogo

32

Die Node-Javascript-Version hängt davon ab, welche Version von v8 Node verwendet. Die Knotenversion 0.5.1 (14. Juli 2011) und höher verwendet Version 8.4.4.10 oder höher und ist die 5. Ausgabe von ECMA-262 anstelle der 3. Ausgabe. Die 5. Ausgabe entspricht Javascript 1.8.5. Siehe unten Gründe.

Zwischen dem 21. Mai 2011 und dem 15. Juni 2011 wurde auf der v8-Website v8 nicht mehr als Implementierung der 3. Ausgabe von ECMA-262 aufgeführt und die 5. Ausgabe angezeigt. http://web.archive.org/web/20110521053630/http://code.google.com/p/v8/ http://web.archive.org/web/20110615102350/http://code.google. com / p / v8 /

Laut dem v8-Änderungsprotokoll wurde v8 am 15. Juni 2011 auf Version 3.4.4 geändert. Diese Version und höher sind also die 5. Ausgabe.

Laut dem Node Changelog war v8 3.4.10 in Node Version 0.5.1, 14. Juli 2011, so dass diese Version und höher die 5. Ausgabe von ECMA-26 sind. Dies bedeutet jedoch nicht, dass v8-Versionen vor 3.4.10 nur die 3. Ausgabe waren, da es in vielen v8-Versionen möglicherweise einen stetigen Übergang von der 3. zur 5. Version gegeben hat.


Nun, obwohl V8 auf die 5. Ausgabe umgestellt hat, gibt es keine Hinweise darauf, dass Node in Version 0.5.1+ tatsächlich vollständig damit übereinstimmt. Mein 0.6.12 unterstützt Object.prototype.getOwnPropertyNames () nicht, obwohl es in ECMA262-5th 15.2.3.4 aufgeführt ist.
Soletan

1
Ich muss meinen vorherigen Kommentar korrigieren, da die erwähnte Methode statisch ist, anstatt an Object.protoype gebunden zu sein (was tatsächlich in Knoten 0.6.12 enthalten ist), und daher gibt es keine Hinweise darauf, dass NodeJS ECMA262-5 nicht vollständig unterstützt ...
Soletan

19

Irgendwann wurde node.green erstellt, um die Unterstützung von JavaScript-Funktionen für verschiedene Node-Versionen zu verfolgen.


1

Es scheint, als wären wir auf zwei Strategien reduziert worden, um herauszufinden, welche Version des Javascript-Knotens verwendet wird:

Strategie 1: Vertrauen Sie auf das, was irgendwo in einem Dokument steht, was in vielen Fällen falsch ist. Ich habe die Tabelle nicht gefunden, die die Schlüssel-Wert-Paare angibt, welche Version des Knotens welche Version von ECMAScript unterstützt.

Strategie 2: Erraten und Überprüfen.

Suchen Sie eine von ES6 zitierte Funktion und "sehen Sie, ob sie fehlschlägt".

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

Ich nehme an, das "Babel" hier ist ein Hinweis auf das Tanakh. Welche Funktionen unterstützt unsere Version von Node? Nun, ich weiß nicht, Sie müssen es manuell testen. Dies wird eine riesige MESS. Und schlimmer noch, es scheint absichtlich zu sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.