JavaScript foreach中的sum索引

sum index in JavaScript foreach

本文关键字:索引 sum 中的 foreach JavaScript      更新时间:2023-09-26

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

var data = ['xxx', 'yyy'];
for (var i in data)
{
    var a = i;
    var b = data[i];
}

前两个迭代工作得很好。我在i中得到索引"0""1",然后它再循环一次,现在i"sum"。这是经过设计的吗?或者这个额外的迭代是用来做什么的?在我的例子中,结果总是空的,它弄乱了我的代码。有没有办法不做额外的循环?

BRAndreas

看起来您(或您包含的其他代码)已经在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/

您正在遍历Array,而不是Object。对于数组,最好使用:

for (var i=0; i<data.length; i=i+1){
  /* ... */
}

在你的循环中,数组对象的每个属性都被考虑在内。这使得数组的for ... in循环更不可预测。在你的情况下,看起来sum是一个属性(方法),添加到Array.prototype在你的代码的其他地方。

有更多遍历数组的方法。例如这个so问题,或者这个

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

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;});

这是一种安全迭代的方法。

var data = ['xxx', 'yyy'];
for (var i = 0; i < data.length; i++)
{
    var a = i;
    var b = data[i];
}

你得到的是一个方法来自扩展数组对象,我猜你正在使用一些库,那里是类似的东西Array.prototype.sum = function () {...};

也许这样设置数据会更好:var data = {0:'xxx', 1:'yyy'};

首先data是一个对象。尝试添加console.log(a);和console.log (b);在循环中,你会看到。