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?


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 .


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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.