2011-02-28 11 views
60

Estoy comenzando con Node.js y estoy teniendo dificultades para averiguar qué versión de JavaScript es compatible con nodo, lo que hace que sea difícil averiguar qué características puedo utilizar. Esto es lo que sé.¿Qué versión de Javascript es compatible en node.js

  • Node utiliza V8
  • V8 implementa ECMAScript como se especifica en ECMA-262, 3ª edición
  • ECMA-262, 3ª edición es JavaScript 1.5

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

¿Dónde me estoy equivocando? ¿Hay algún documento en alguna parte que detalle las características del idioma disponible?

+0

Para una actualización de 2015, consulte [Funciones de ECMAScript 6 disponibles en Node.js 0.12] (http://stackoverflow.com/questions/28388885/ecmascript-6-features-available-in-node-js-0-12) –

+0

Y una actualización 05.2016, de acuerdo con [nodejs docs] (https://nodejs.org/en/docs/es6/), siguen [especificación JavaScript ECMA-262, 6ª edición] (http: //www.ecma- international.org/publications/standards/Ecma-262.htm) y "Todas las características de ECMAScript 2015 (ES6) se dividen en tres grupos para funciones de envío, en etapas y en progreso" –

Respuesta

29

This matrix (V8 sigue la columna 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 3rd edition es compatible, pero muchas funciones de la 5ª edición también son compatibles.

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

30

La versión de javascript del nodo depende de la versión de v8 que utilice el nodo. La versión de nodo 0.5.1 (14 de julio de 2011) y posteriores usan v8 3.4.10 o posterior, y son la 5ª edición de ECMA-262, en lugar de la 3ª edición. La 5ª edición es equivalente a Javascript 1.8.5. Ver abajo razones.

Entre el 21 de mayo de 2011 y el 15 de junio de 2011, el sitio web de v8 dejó de incluir a v8 como implementación de la 3ª edición de ECMA-262 y comenzó a mostrar la quinta 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/

De acuerdo con el registro de cambios v8, el 15 de junio 2011 v8 cambió a la versión 3.4.4. Entonces esa versión y más tarde son 5ª edición.

De acuerdo con el registro de cambios del nodo, v8 3.4.10 estaba en la versión 0.5.1, 14 de julio de 2011, por lo que esa versión y más tarde son la quinta edición ECMA-26. Sin embargo, esto no significa que las versiones v8 anteriores a la 3.4.10 fueron puramente la 3ª edición, ya que puede haber habido una transición constante de la 3ª a la 5ª a través de muchas versiones de v8.

+0

Bueno, aunque V8 estaba cambiando a la 5ª edición allí no hay evidencia de que Node cumpla con esto completamente en las versiones 0.5.1+. Mi 0.6.12 no admite Object.prototype.getOwnPropertyNames() aunque figura 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 admita por completo ECMA262-5th ... – soletan

1

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

Estrategia 1: confianza en lo que algún documento dice en alguna parte, lo que está mal 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: guess-and-check.

Encuentra una característica citado por ES6 y "ver si se produce un error", algo como esto:

[email protected]:~/code$ echo "console.log('blue'.includes('blue'))" > a.js 
[email protected]:~/code$ cat a.js 
console.log('blue'.includes('blue')) 
[email protected]:~/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 
[email protected]:~/code$ babel-node a.js 
true 

supongo que la "babel" aquí es una referencia a la Tanaj. ¿Qué funciones 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.

5

Parece que, en algún momento, se creó node.green para rastrear el soporte de características de JavaScript contra diferentes versiones de Nodo.

Cuestiones relacionadas