2011-08-25 49 views
44

我想使用for each ... in与Node.js(v0.4.11)。Node.js:对于每个...在不工作

我用这样的:

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

我得到以下错误:

 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) 

哪里错了吗?自Javascript 1.6以来,支持for each ... in

有关使用for each ... in的信息,请参阅MDN

+4

V8实现ECMAScript。 MDN文档显示'ECMA version:none' – user113716

回答

98

不幸的是,节点不支持for each ... in,即使它是在JavaScript 1.6中指定的。 Chrome使用相同的JavaScript引擎,并且具有类似的缺点reported as

您必须结算array.forEach(function(item) { /* etc etc */ })

编辑:从谷歌官方的V8网站:

V8 implements ECMAScript as specified in ECMA-262 .

同MDN网站,它说,for each ...in是在JavaScript 1.6,它说,它是不是在任何ECMA版本 - 因此,据推测,其缺席节点。

+6

不要忘记'Object.keys'来将对象的键转换为数组 – goatslacker

+0

好吧,如果这就是V8的行为方式,那我就没问题。我可以使用'for ... in',但想要一些语法糖。感谢您的信息。 – pvorb

2

Node.js支持的ECMAScript版本中没有for each in,目前只支持firefox。

重要的是要注意的是,JavaScript版本只与Gecko(Firefox的引擎)和Rhino(后面总是少数几个版本)有关。节点使用V8随后的ECMAScript规范

+2

这里有_is_各个。有点。 'for each'是一种替代语法,应该像原始问题那样工作,但实际上它显然是在“JavaScript 1.6”中,但不在ECMAScript规范中,因此并不总是受支持。 (即使支持,我更喜欢你的答案中的语法。) – nnnnnn

+0

是的,真的有一个:[for each ... in](https://developer.mozilla.org/en/JavaScript/Reference/ Statements/for_each ... in) – pvorb

+1

@nnnnnn有一个,但不适用于EcmaScript。使用MDN时应该小心,因为它的版本JavaScript没有得到广泛支持 –

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

是的,它的确如此,但不是我想要的。现在我必须坚持这个版本。 – pvorb

+4

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

6

https://github.com/cscott/jsshaper实现了从JavaScript 1.8到5.1的ECMAScript一个翻译,这样可以让你在代码中使用“每个” WebKit的或节点上运行。