Node.js: for each … in 不起作用

63

我想在 Node.js (v0.4.11) 中使用 for each ... in

我是这样使用的:

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)

哪里出了错?for each ... in 自 Javascript 1.6 开始就被支持了。

请参考 MDN 获取有关 for each ... in 的用法信息。


4
V8 实现了 ECMAScript。MDN 文档显示“ECMA 版本:无”。 - user113716
6个回答

123

很遗憾,Node不支持for each ... in,尽管它在JavaScript 1.6中被指定。Chrome使用相同的JavaScript引擎,据报道也存在类似的缺陷。

你只能使用array.forEach(function(item) { /* etc etc */ })

编辑:来自Google官方V8网站:

V8按照ECMA-262规范实现ECMAScript。

在同一MDN网站上,它说for each ...in在JavaScript 1.6中,但它没有在任何ECMA版本中出现,因此可能是Node中缺少它的原因。


7
别忘了使用 Object.keys 将对象的键转换为数组。 - goatslacker
好的,如果V8就是这样运行的话,我可以接受。我能够使用for ... in,但希望有一些语法糖。感谢您提供的信息。 - pvorb

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

是的,那样做是一样的,但这不是我想要的。现在我必须坚持使用这个版本。 - pvorb
4
或者 console.log(conf[i].path) - Matiss

6

https://github.com/cscott/jsshaper 实现了一个将 JavaScript 1.8 翻译成 ECMAScript 5.1 的翻译器,这使得你可以在运行于 Webkit 或 Node 上的代码中使用 'for each'。


3

这可能是一个旧问题,但为了保持更新,Javascript中有一个可以与NodeJS一起使用的forEach方法。

这是来自文档的链接。

下面是一个例子:

     count = countElements.length;
        if (count > 0) {
            countElements.forEach(function(countElement){
                console.log(countElement);
            });
        }

2

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

需要注意的是,JavaScript版本只与Gecko(Firefox引擎)和Rhino相关(始终落后几个版本)。而Node使用的是遵循ECMAScript规范的V8引擎。


2
有一个 each。有点像。for each 是一种替代语法,应该可以像原问题中那样工作,但实际上它只在 "JavaScript 1.6" 中存在,而不在 ECMAScript 规范中,因此并不总是被支持。(即使在支持的情况下,我仍然更喜欢你答案中的语法。) - nnnnnn
是的,确实有一个each:for each ... in - pvorb
1
@nnnnnn,有一个,但不适用于EcmaScript。在使用MDN时应该始终小心,因为它的版本JavaScript并没有得到广泛支持。 - Ruan Mendes

0

对于习惯使用 PHP 的人:

//add this function
function foreach(arr, func){
  for(var i in arr){
    func(i, arr[i]);
  }
}

用法:

foreach(myArray, function(i, v){
  //run code here
});

类似于 PHP 版本:

foreach(myArray as i=>v){
  //run code here
}

如果你使用这个函数遍历一个数组,length 属性也将被包括在内,所以你需要防范它。 - Genhis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接