在下面的代码示例中,我得到了一个奇怪的行为
var data = ['xxx', 'yyy'];
for (var i in data)
{
var a = i;
var b = data[i];
}
两个第一次迭代工作得很好。我在"0"
中获得了索引"1"
和i
,但随后又循环了一次,现在i
为"sum"
。这是设计还是这个额外的迭代用于什么?在我的情况下,结果总是空的,它会弄乱我的代码。有没有办法不做他的额外循环?
BR 安德烈亚斯
答案 0 :(得分:6)
看起来你(或者你已经包含的其他一些代码)已经在Array原型上添加了额外的属性。您应该做的是检查您正在迭代的对象是否实际上在本身上具有该属性,而不是在其原型上:
for (i in data) {
if (data.hasOwnProperty(i)) {
a = i;
b = data[i];
}
}
那就是说,你不应该在数组上使用for .. in
。使用常规for
循环。
有关详细信息,请参阅此处:http://yuiblog.com/blog/2006/09/26/for-in-intrigue/
答案 1 :(得分:4)
您正在循环Array
,而不是Object
。对于数组,最好使用:
for (var i=0; i<data.length; i=i+1){
/* ... */
}
在循环中,会考虑Array对象的每个属性。这使得数组的for ... in
循环不太可预测。在您的情况下,sum
似乎是一个属性(方法),已添加到代码中其他位置的Array.prototype
。
有更多方法可以循环遍历数组。例如,请参阅this SO-question或this one
只是为了好玩,一种更为深奥的方式来循环数组:
Array.prototype.loop = function(fn){
var t = this;
return (function loop(fn,i){
return i ? loop(fn,i-1).concat(fn(t[i-1])) : [];
}(fn,t.length));
}
//e.g.
//add 1 to every value
var a = [1,2,3,4,5].loop(function(val){return val+1;});
alert(a); //=> [2,3,4,5,6]
//show every value in console
var b = [1,2,3,4,5].loop(function(val){return console.log(val), val;});
答案 2 :(得分:2)
这是一种安全迭代的方法。
var data = ['xxx', 'yyy'];
for (var i = 0; i < data.length; i++)
{
var a = i;
var b = data[i];
}
你得到的是一个来自扩展Array对象的方法,我想你正在使用一些类似的库
Array.prototype.sum = function () {...};
答案 3 :(得分:1)
也许设置这样的数据会更好:var data = {0:'xxx', 1:'yyy'};
答案 4 :(得分:1)
首先,data
是一个对象。尝试添加console.log(a);和console.log(b);在你的循环中,你会看到。