你认为……有很大的不同吗?In和for循环?你更喜欢用哪种for ?为什么?

假设我们有一个关联数组数组:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

所以我们可以迭代:

for (var i = 0; i < myArray.length; i++)

And:

for (var i in myArray)

我看不出有什么大的不同。是否存在性能问题?


当前回答

我会根据我想引用项目的方式使用不同的方法。

如果只需要当前项,请使用foreach。

如果需要索引器进行相对比较,请使用for。(也就是说,这与上一项/下一项相比如何?)

我从来没有注意到性能上的差异。我会等到出现性能问题时再担心。

其他回答

尽管它们非常相似,但有一个微小的区别:

var array = ["a", "b", "c"];
array["abc"] = 123;
console.log("Standard for loop:");
for (var index = 0; index < array.length; index++)
{
  console.log(" array[" + index + "] = " + array[index]); //Standard for loop
}

在这种情况下,输出是:

循环的标准:

数组[0]= a

数组[1]= b

数组[2]= c

console.log("For-in loop:");
for (var key in array)
{
  console.log(" array[" + key + "] = " + array[key]); //For-in loop output
}

而在这种情况下,输出是:

工党循环:

数组[1]= b

数组[2]= c

数组[10]= d

数组[ABC] = 123

这是我做的事情。

function foreach(o, f) {
 for(var i = 0; i < o.length; i++) { // simple for loop
  f(o[i], i); // execute a function and make the obj, objIndex available
 }
}

这就是你使用它的方式 这将适用于数组和对象(如HTML元素列表)

foreach(o, function(obj, i) { // for each obj in o
  alert(obj); // obj
  alert(i); // obj index
  /*
    say if you were dealing with an html element may be you have a collection of divs
  */
  if(typeof obj == 'object') { 
   obj.style.marginLeft = '20px';
  }
});

我只是做了这个,所以我愿意听取建议:)

我认为你应该根据你的需要来选择迭代方法。我建议你不要用for in结构来循环原生数组。它的速度要慢得多,而且正如Chase Seibert刚才指出的那样,它与Prototype框架不兼容。

有一个关于不同循环风格的优秀基准测试,如果您使用JavaScript,绝对应该看看。不要做早期的优化,但你应该把这些东西放在你脑后的某个地方。

我将使用for in来获取对象的所有属性,这在调试脚本时特别有用。例如,当我探索不熟悉的物体时,我喜欢把这句话放在手边:

l = ''; for (m in obj) { l += m + ' => ' + obj[m] + '\n' } console.log(l);

它将整个对象的内容(连同方法体)转储到Firebug日志中。非常方便。

注意本机Array。每种方法现在都得到广泛支持。

使用forEach跳过原型链

只是上面@nail的答案的一个快速附录,使用forEach和对象。keys意味着你可以避免在原型链上迭代,而不必使用hasOwnProperty。

var Base = function () {
    this.coming = "hey";
};

var Sub = function () {
    this.leaving = "bye";
};

Sub.prototype = new Base();
var tst = new Sub();

for (var i in tst) {
    console.log(tst.hasOwnProperty(i) + i + tst[i]);
}

Object.keys(tst).forEach(function (val) {
    console.log(val + tst[val]);
});