JavaScript foreach中的sum索引

And*_*eas 0 javascript foreach

在下面的代码示例中,我得到一个奇怪的行为

var data = ['xxx', 'yyy'];
for (var i in data)
{
    var a = i;
    var b = data[i];
}
Run Code Online (Sandbox Code Playgroud)

两个第一次迭代工作得很好.我得到的指数"0""1"i,但随后循环一个额外的时间和现在i"sum".这是设计还是这个额外的迭代用于什么?在我的情况下,结果总是空的,它会弄乱我的代码.有没有办法不做他的额外循环?

BR安德烈亚斯

nic*_*ckf 6

看起来你(或者你已经包含的其他代码)已经在Array原型上添加了额外的属性.你应该做的是检查,看看你遍历实际上对象是否具有对财产本身,而不是它的原型:

for (i in data) {
    if (data.hasOwnProperty(i)) {
        a = i;
        b = data[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,你永远不应该for .. in在数组上使用.使用常规for循环.

有关更多信息,请参见此处:http://yuiblog.com/blog/2006/09/26/for-in-intrigue/


Koo*_*Inc 5

您正在循环 an Array,而不是通过 an Object。对于数组,最好使用:

for (var i=0; i<data.length; i=i+1){
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

在循环中,会考虑 Array 对象的每个属性。这使得for ... in数组的循环变得更不可预测。在您的情况下,它看起来像是sum添加到Array.prototype代码中其他位置的属性(方法)。

还有更多方法可以循环遍历数组。例如,参见这个 SO-question,或者这个

只是为了好玩,一种更深奥的循环数组的方法:

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;});
Run Code Online (Sandbox Code Playgroud)