Qué versión de Javascript es compatible con node.js

81

Estoy comenzando con Node.js y estoy teniendo dificultades para averiguar qué versión de JavaScript es compatible con node, lo que dificulta descubrir qué funciones puedo usar. Esto es lo que sé.

  • El nodo usa V8
  • V8 implementa ECMAScript como se especifica en ECMA-262, tercera edición
  • ECMA-262, 3.ª edición es JavaScript 1.5

Dado esto, supongo que puedo usar código compatible con JavaScript 1.5 en node. Sin embargo, resulta que puedo usar Array.forEach, entre otras construcciones, aunque según MDC no está disponible hasta Javascript 1.6 - ECMA-262, 5ª edición.

¿Dónde me equivoco? ¿Hay algún documento en alguna parte que detalle las funciones de idioma disponibles?

emtrane
fuente
Para obtener una actualización de 2015, consulte las características de ECMAScript 6 disponibles en Node.js 0.12 .
Dan Dascalescu
Y una actualización de 05.2016, según los documentos de nodejs , siguen la especificación JavaScript ECMA-262, sexta edición y "Todas las características de ECMAScript 2015 (ES6) se dividen en tres grupos para características de envío, etapas y en progreso"
Petar Donchev Marinov
ECMA-262 es ECMAScript 5.1 es Javascript 1.8.5, consulte también (desplácese hacia abajo para ver las especificaciones): developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Codebeat

Respuestas:

37

Esta matriz (V8 sigue la columna de WebKit bastante de cerca) parece responder bastante bien a la pregunta "¿qué funciones puedo usar?" pero no puedo encontrar una respuesta canónica a "¿Qué versión de JavaScript es compatible?" Por lo que puedo decir, la mejor respuesta es esta: ECMA-262 3ª edición es compatible, pero muchas características de la 5ª edición también son compatibles.

Hay una buena explicación de por qué V8 sigue la funcionalidad de WebKit y JavaScriptCore en este hilo .

Benson
fuente
1
Actualización 2020: vea la respuesta de Nate Whittaker .
rinogo
32

La versión de JavaScript de Node depende de la versión de v8 que use Node. La versión de nodo 0.5.1 (14 de julio de 2011) y posteriores usan v8 3.4.10 o posterior, y son ECMA-262 de quinta edición, en lugar de la tercera edición. La quinta edición es equivalente a Javascript 1.8.5. Vea las razones a continuación.

Entre el 21 de mayo de 2011 y el 15 de junio de 2011, el sitio web de la versión 8 dejó de incluir la versión 8 como implementación de la 3ª edición de ECMA-262 y comenzó a mostrar la 5ª edición. http://web.archive.org/web/20110521053630/http://code.google.com/p/v8/ http://web.archive.org/web/20110615102350/http://code.google. com / p / v8 /

Según el registro de cambios de la v8, el 15 de junio de 2011, la v8 cambió a la versión 3.4.4. Entonces esa versión y posteriores son la 5ª edición.

De acuerdo con el registro de cambios de Node, v8 3.4.10 estaba en la Versión de Nodo 0.5.1, 14 de julio de 2011, por lo que la versión y posteriores son la 5ta edición ECMA-26. Sin embargo, esto no significa que las versiones v8 anteriores a la 3.4.10 fueran puramente la tercera edición, ya que puede haber habido una transición constante de la tercera a la quinta a través de muchas versiones v8.

John Middlemas
fuente
Bueno, a pesar de que V8 estaba cambiando a la quinta edición, no hay evidencia de que Node lo cumpla completamente en las versiones 0.5.1+. Mi 0.6.12 no es compatible con Object.prototype.getOwnPropertyNames () aunque aparece en ECMA262-5th 15.2.3.4.
soletan
1
Tengo que corregir mi comentario anterior, ya que el método mencionado es estático en lugar de estar vinculado a Object.protoype (que de hecho está incluido con el nodo 0.6.12) y, por lo tanto, no hay evidencia de que NodeJS no sea totalmente compatible con ECMA262-5th ...
soletan 22/08/12
19

Parece que, en algún momento, node.green se creó para rastrear el soporte de funciones de JavaScript en diferentes versiones de Node.

Nate Whittaker
fuente
1

Parece que nos hemos reducido a dos estrategias para averiguar qué versión del nodo Javascript utiliza:

Estrategia 1: confiar en lo que dice algún documento en alguna parte, lo cual es incorrecto en muchos casos. No he encontrado la tabla que indica los pares clave-valor de qué versión de nodo admite qué versión de ECMAScript.

Estrategia 2: adivinar y comprobar.

Busque una función citada por ES6 y "vea si falla", algo como esto:

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

Supongo que la "babel" aquí es una referencia al Tanakh. ¿Qué características admite nuestra versión de nodo? Bueno, no sé, tendrás que probarlo manualmente. Esto se convertirá en un MESS gigante. Y lo que es peor, parece ser a propósito.

Eric Leschinski
fuente