2011-08-25 9 views
44

Quería usar for each ... in con Node.js (v0.4.11).Node.js: para cada ... en que no funciona

lo uso como esto:

var conf = { 
    index: { 
     path: { 
     first: "index.html", 
     pattern: "index/{num}.html" 
     }, 
     template: "index.tpl", 
     limit: 8 
    }, 
    feed: { 
     path: "feed.xml", 
     template: "atom.tpl", 
     limit: 8 
    } 
} 

for each (var index in conf) { 
    console.log(index.path); 
} 

me sale el siguiente error:

 for each (var index in conf) { 
    ^^^^ 

node.js:134 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
SyntaxError: Unexpected identifier 
    at Module._compile (module.js:397:25) 
    at Object..js (module.js:408:10) 
    at Module.load (module.js:334:31) 
    at Function._load (module.js:293:12) 
    at require (module.js:346:19) 
    at Object.<anonymous> (/home/paul/dev/indexing/lib/Index.js:3:13) 
    at Module._compile (module.js:402:26) 
    at Object..js (module.js:408:10) 
    at Module.load (module.js:334:31) 
    at Function._load (module.js:293:12) 

¿Dónde está el error? for each ... in es compatible desde Javascript 1.6.

Consulte MDN para obtener información acerca del uso de for each ... in.

+4

V8 implementa ECMAScript. Los documentos de MDN muestran 'ECMA version: none' – user113716

Respuesta

98

Desafortunadamente, el nodo no es compatible con for each ... in, aunque está especificado en JavaScript 1.6. Chrome usa el mismo motor de JavaScript y tiene reported as con una falla similar.

Tendrá que conformarse con array.forEach(function(item) { /* etc etc */ }).

EDIT: De la web V8 oficial de Google:

V8 implements ECMAScript as specified in ECMA-262 .

En el mismo sitio web MDN donde dice que for each ...in es en JavaScript 1.6, que dice que no se encuentra en cualquier versión ECMA - por lo tanto, es de suponer, su ausencia del nodo

+6

No olvide' Object.keys' para convertir las claves del objeto a una matriz – goatslacker

+0

Bueno, si así es como se comporta V8, estoy de acuerdo con eso. Puedo usar 'for ... in' pero quería tener algo de azúcar sintáctico. Gracias por la información. – pvorb

2

No hay for each in en la versión de ECMAScript compatible con Node.js, solo compatible con Firefox actualmente.

Lo importante a tener en cuenta es que las versiones de JavaScript solo son relevantes para Gecko (el motor de Firefox) y Rhino (que siempre tiene algunas versiones). Nodo utiliza V8 que sigue las especificaciones ECMAScript

+2

Hay _is_ an each. Más o menos 'para cada uno' es una sintaxis alternativa que debería funcionar como se hizo en la pregunta original, pero en la práctica aparentemente está en" JavaScript 1.6 "pero no en la especificación ECMAScript, por lo que no siempre es compatible. (Aunque incluso donde es compatible, prefiero la sintaxis de su respuesta.) – nnnnnn

+0

Sí, realmente hay un: [para cada ... en] (https://developer.mozilla.org/es/JavaScript/Reference/ Statements/for_each ... in) – pvorb

+1

@nnnnnn Hay uno, pero no para EcmaScript. Siempre debe tener cuidado al usar MDN, ya que su versión, JavaScript, no es ampliamente compatible –

58
for (var i in conf) { 
    val = conf[i]; 
    console.log(val.path); 
} 
+0

Sí, eso hace lo mismo, pero no es lo que yo quería. Ahora tengo que apegarme a esta versión. – pvorb

+4

o 'console.log (conf [i] .path)' –

6

https://github.com/cscott/jsshaper implementa un traductor de JavaScript 1.8 a ECMAScript 5.1, lo que permitirá utilizar for each en el código que se ejecuta en WebKit o nodo.

Cuestiones relacionadas