我有一些javascript,如下所示
for (var titleKey in data.d) {
var title = data.d[titleKey];
}
这实际上是从对.NET Web服务的JQuery调用回来的,但我不相信这是相关的。
我的循环正确地迭代集合中的每个元素,然后它再次继续循环。这里的titleKey是'indexof',title是'undefined'。
这发生在我的代码中的两个不同的地方。
造成这种情况的原因是什么?我该如何预防?
提前致谢。
答案 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的问题。但它仍然有效,所以我不会删除它。