2011-08-25 14 views
44

Volevo utilizzare for each ... in con Node.js (v0.4.11).Node.js: per ogni ... non funziona

lo uso così:

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); 
} 

ottengo il seguente errore:

 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) 

Dov'è l'errore? for each ... in è supportato da Javascript 1.6.

Vedi MDN per informazioni sull'uso di for each ... in.

+4

V8 implementa ECMAScript. I documenti MDN mostrano 'Versione ECMA: nessuna' – user113716

risposta

98

Sfortunatamente il nodo non supporta for each ... in, anche se è specificato in JavaScript 1.6. Chrome utilizza lo stesso motore JavaScript ed è reported as con un problema simile.

Dovrai accontentarti di array.forEach(function(item) { /* etc etc */ }).

EDIT: Dal sito V8 ufficiale di Google:

V8 implements ECMAScript as specified in ECMA-262 .

Sullo stesso sito MDN in cui si dice che for each ...in è in JavaScript 1.6, si dice che non si trova in alcuna versione ECMA - quindi, presumibilmente, la sua assenza dal nodo.

+6

Non dimenticare' Object.keys' per convertire le chiavi dell'oggetto in una matrice – goatslacker

+0

Bene, se è così che si comporta V8, sto bene con quello. Sono in grado di usare 'for ... in' ma voglio avere dello zucchero sintattico. Grazie per l'informazione. – pvorb

2

Non c'è for each in nella versione di ECMAScript supportato da Node.js, attualmente supportato solo da firefox.

La cosa importante da notare è che le versioni JavaScript sono rilevanti solo per Gecko (il motore di Firefox) e Rhino (che è sempre qualche versione precedente). Nodo utilizza V8 che segue le specifiche ECMAScript

+2

Là c'è un ciascuno. Una specie di. 'for each' è una sintassi alternativa che dovrebbe funzionare come nella domanda originale, ma in pratica apparentemente è in" JavaScript 1.6 "ma non nella specifica ECMAScript e quindi non è sempre supportata. (Anche se è supportato, preferisco la sintassi della risposta.) – nnnnnn

+0

Sì, ce n'è davvero uno ciascuno: [per ogni ... in] (https://developer.mozilla.org/en/JavaScript/Reference/ Istruzioni/for_each ... in) – pvorb

+1

@nnnnnn Ce n'è uno, ma non per EcmaScript. Dovresti sempre stare attento quando usi MDN, dal momento che la sua versione, JavaScript, non è ampiamente supportata –

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

Sì, questo fa lo stesso, ma non è quello che volevo. Ora devo attenermi a questa versione. – pvorb

+4

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

6

https://github.com/cscott/jsshaper implementa un traduttore da JavaScript 1.8 a ECMAScript 5.1, che permetterà di utilizzare 'per ogni' nel codice in esecuzione su webkit o nodo.

Problemi correlati