Яка версія Javascript підтримується в node.js


81

Я починаю роботу з Node.js, і мені важко зрозуміти, яку версію JavaScript підтримує node, що ускладнює з'ясування того, які функції я можу використовувати. Ось що я знаю.

  • Вузол використовує V8
  • V8 реалізує ECMAScript, як зазначено у ECMA-262, 3-е видання
  • ECMA-262, 3-е видання - це JavaScript 1.5

Враховуючи це, я вважаю, що я можу використовувати у вузлі код, сумісний з JavaScript 1.5. Однак, виявляється, я можу використовувати Array.forEach, серед інших конструкцій, хоча, згідно з MDC, він доступний лише до Javascript 1.6 - ECMA-262, 5-е видання.

Де я помиляюся? Чи є десь документ, в якому детально описані доступні мовні функції?



І оновлення від 05.2016 р., Згідно з документами nodejs , вони відповідають специфікації JavaScript ECMA-262, 6-е видання та "Усі функції ECMAScript 2015 (ES6) розділені на три групи для доставки, поетапно та в процесі виконання"
Петро Дончев Марінов,

ECMA-262 - це ECMAScript 5.1 - це Javascript 1.8.5, див. Також (прокрутіть вниз до специфікацій): developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Codebeat

Відповіді:


37

Ця матриця (V8 досить уважно стежить за стовпцем WebKit), схоже, досить добре відповідає на питання "які функції я можу використовувати?" але я не можу знайти канонічну відповідь на питання "яка версія javascript підтримується?" Наскільки я можу зрозуміти, найкраща відповідь така: ECMA-262 3-е видання підтримується, але також підтримуються багато функцій 5-го видання.

У цьому потоці є гарне пояснення, чому V8 дотримується функцій WebKit та JavaScriptCore .


1
Оновлення за 2020 рік: Дивіться відповідь Нейта Віттейкера .
rinogo

32

Версія JavaScript Node залежить від того, яку версію v8 використовує Node. Вузол версії 0.5.1 (14 липня 2011 р.) Та новіших версій використовує v8 3.4.10 або пізнішої версії і є 5-м виданням ECMA-262, а не 3-м виданням. 5-е видання еквівалентно Javascript 1.8.5. Див. Причини нижче.

У період з 21 травня 2011 року по 15 червня 2011 року веб-сайт 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, 15 червня 2011 року v8 змінився на версію 3.4.4. Тож ця версія та новіші версії є 5-м виданням.

Відповідно до журналу змін Node, v8 3.4.10 був у версії Node 0.5.1, 14 липня 2011 року, тому ця версія та пізніші версії є 5-м виданням ECMA-26. Це не означає, що версії v8 до 3.4.10 були суто 3-м виданням, оскільки, можливо, відбувся стійкий перехід з 3-го на 5-е через багато версій v8.


Ну, навіть незважаючи на те, що V8 переходив на 5-те видання, немає жодних доказів того, що Node насправді повністю відповідає йому у версіях 0.5.1+. Мій 0.6.12 не підтримує Object.prototype.getOwnPropertyNames (), хоча він зазначений у ECMA262-5th 15.2.3.4.
солетан

1
Потрібно виправити мій попередній коментар, оскільки згаданий метод є статичним, замість того, щоб бути прив'язаним до Object.protoype (який справді входить до вузла 0.6.12), і, отже, немає доказів того, що NodeJS не повністю підтримує ECMA262-5th ...
soletan


1

Здається, що ми зводилися до двох стратегій, щоб з’ясувати, яку версію вузла 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

Я припускаю, що "бабель" тут є посиланням на Танах. Які функції підтримує наша версія вузла? Ну, я не знаю, вам доведеться перевірити це вручну. Це стане гігантським MESS. І ще гірше, здається, це спеціально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.