Jaka wersja Javascript jest obsługiwana w node.js.

81

Rozpoczynam pracę z Node.js i mam problem ze znalezieniem wersji JavaScript obsługiwanej przez węzeł, co utrudnia ustalenie, jakich funkcji mogę użyć. Oto co wiem.

Biorąc to pod uwagę, zakładam, że mogę użyć kodu zgodnego z JavaScript 1.5 w węźle. Okazuje się jednak, że mogę użyćArray.forEach między innymi konstrukcje, mimo że według MDC jest on dostępny dopiero w Javascript 1.6 - ECMA-262, wydanie 5.

Gdzie się mylę? Czy jest gdzieś dokument, który szczegółowo opisuje dostępne funkcje językowe?

emtrane
źródło
Aby uzyskać aktualizację z 2015 r., Zobacz funkcje ECMAScript 6 dostępne w Node.js 0.12 .
Dan Dascalescu
Aktualizacja z 05.2016, zgodnie z dokumentacją nodejs , jest zgodna ze specyfikacją JavaScript ECMA-262, 6. edycja i „Wszystkie funkcje ECMAScript 2015 (ES6) są podzielone na trzy grupy dla funkcji wysyłki, etapów i w toku”
Petar Donchev Marinov
ECMA-262 to ECMAScript 5.1 to Javascript 1.8.5, zobacz także (przewiń w dół do specyfikacji): developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Codebeat

Odpowiedzi:

37

Ta macierz (V8 dość blisko podąża za kolumną WebKit) wydaje się całkiem dobrze odpowiadać na pytanie „jakich funkcji mogę używać?” ale nie mogę znaleźć kanonicznej odpowiedzi na pytanie „która wersja javascript jest obsługiwana?” O ile wiem, najlepsza odpowiedź brzmi: 3. edycja ECMA-262 jest obsługiwana, ale wiele funkcji piątej edycji jest również obsługiwanych.

Istnieje dobre wyjaśnienie, dlaczego V8 podąża za funkcjami WebKit i JavaScriptCore w tym wątku .

Benson
źródło
1
Aktualizacja 2020: Zobacz odpowiedź Nate Whittakera .
rinogo
32

Wersja javascript Node zależy od wersji v8 używanej przez Node. Węzeł w wersji 0.5.1 (14 lipca 2011 r.) I nowsze używają wersji 8 3.4.10 lub nowszej i są to 5. wydanie ECMA-262, a nie 3. wydanie. Wydanie piąte jest odpowiednikiem Javascript 1.8.5. Zobacz poniżej powody.

Od 21 maja 2011 do 15 czerwca 2011 strona v8 przestała wymieniać v8 jako implementującą 3. edycję ECMA-262 i zaczęła pokazywać 5. edycję. http://web.archive.org/web/20110521053630/http://code.google.com/p/v8/ http://web.archive.org/web/20110615102350/http://code.google. com / p / v8 /

Zgodnie z dziennikiem zmian w wersji 8, 15 czerwca 2011 r. Wersja 8 została zmieniona na wersję 3.4.4. Więc ta wersja i późniejsze to wydanie 5.

Zgodnie z dziennikiem zmian węzła, wersja 8 3.4.10 znajdowała się w wersji Node 0.5.1, 14 lipca 2011 r., Więc ta wersja i nowsze to 5. edycja ECMA-26. Nie oznacza to jednak, że wersje v8 przed 3.4.10 były czysto trzecią edycją, ponieważ mogło następować stałe przejście z 3. na 5. poprzez wiele wersji v8.

John Middlemas
źródło
Cóż, mimo że V8 przechodziło na piątą edycję, nie ma dowodów na to, że Node rzeczywiście całkowicie się z nią zgadzał w wersjach 0.5.1+. Moja wersja 0.6.12 nie obsługuje Object.prototype.getOwnPropertyNames (), chociaż jest wymieniona w ECMA262-5th 15.2.3.4.
soletan
1
Muszę naprawić mój poprzedni komentarz, ponieważ wspomniana metoda jest metodą statyczną zamiast związaną z Object.protoype (który jest rzeczywiście zawarty w węźle 0.6.12), a zatem nie ma dowodów na to, że NodeJS nie obsługuje w pełni ECMA262-5 ...
soletan
20

Wygląda na to, że w pewnym momencie node.green został utworzony, aby śledzić obsługę funkcji JavaScript w różnych wersjach Node.

Nate Whittaker
źródło
1

Wygląda na to, że zostaliśmy zredukowani do dwóch strategii, aby dowiedzieć się, która wersja węzła JavaScript używa:

Strategia 1: zaufaj temu, co mówi gdzieś jakiś dokument, co w wielu przypadkach jest błędne. Nie znalazłem tabeli wskazującej pary klucz-wartość, których wersja węzła obsługuje daną wersję ECMAScript.

Strategia 2: zgadnij i sprawdź.

Znajdź funkcję cytowaną przez ES6 i „zobacz, czy się nie powiedzie”, na przykład:

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

Przypuszczam, że „babel” jest tu odniesieniem do Tanach. Jakie funkcje obsługuje nasza wersja węzła? Cóż, nie wiem, będziesz musiał to ręcznie przetestować. To będzie gigantyczna MESS. A co gorsza, wydaje się być celowe.

Eric Leschinski
źródło