Javascript for循环返回键“indexof”

时间:2011-11-24 20:19:04

标签: javascript for-loop

我有一些javascript,如下所示

for (var titleKey in data.d) {
  var title = data.d[titleKey];
}

这实际上是从对.NET Web服务的JQuery调用回来的,但我不相信这是相关的。

我的循环正确地迭代集合中的每个元素,然后它再次继续循环。这里的titleKey是'indexof',title是'undefined'。

这发生在我的代码中的两个不同的地方。

造成这种情况的原因是什么?我该如何预防?

提前致谢。

5 个答案:

答案 0 :(得分:5)

您需要从循环中排除原型的属性。 for ... in结构将循环遍历原型链中的所有内容*,而不仅仅是子对象的属性。

for (var titleKey in data.d) {
  if (data.d.hasOwnProperty(titleKey)) {
    // own property //
  }
  else {
    // inherited property //
  }
}

从控制台日志中可以看出我怀疑你有一个库在其原型中实现了indexof for Array。

我的建议是使用correct way走数组:

for (var index = 0; index < data.d.length; index++) {...}

for in用于对象,而不是数组。 这是一个常见的初学者错误,其中一个人滥用了Array派生自Object的事实。

*请参阅davidchambers的评论

答案 1 :(得分:2)

Javascript的“for-in”遍历对象的所有属性,包括方法名称。

答案 2 :(得分:2)

使用以下循环机制:

for (var i = 0; i < titleKey.length; i++) {
  var title = data.d[titleKey[i]];
}

for:in循环遍历对象的所有属性,而不仅仅是可索引的属性。

答案 3 :(得分:1)

如果indexof来自原型链,则必须使用hasOwnProperty来跳过它。

for (var titleKey in data.d) {

    if (data.d.hasOwnProperty(titleKey))
    {
      var title = data.d[titleKey];
    }

}

答案 4 :(得分:0)

根据手头的信息,我会说data.d.indexof 实际上是 undefined。以下是完全有效的数据结构:

foo: 42
bar: [1, 2, 3]
baz: false
indexof: undefined

作为完整性检查,请尝试以下操作:

console.log(Object.prototype.hasOwnProperty.call(data.d, 'indexof'))

编辑:现在已经很清楚数据结构实际上是一个数组,这个答案并不能解决OP的问题。但它仍然有效,所以我不会删除它。