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

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

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

所以我们可以迭代:

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

And:

for (var i in myArray)

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


当前回答

这是我做的事情。

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

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

其他回答

jQuery用户


jQuery的each(回调)方法使用for(;,)默认情况下循环,仅当长度未定义时才使用for(in)。

因此,我认为在使用这个函数时,假设正确的顺序是安全的。

例子:

$(['a','b','c']).each(function() {
    alert(this);
});
//Outputs "a" then "b" then "c"

使用它的缺点是,如果你在做一些非UI逻辑,你的函数将不太容易移植到其他框架。each()函数可能最好保留给jQuery选择器使用,而对于(;,)否则可能是明智的。


根据使用的循环类型和浏览器的不同,会有不同的性能。

例如:

for (var i = myArray.length-1; i >= 0; i--)

在某些浏览器上几乎是以下速度的两倍:

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

然而,除非你的数组是巨大的,或者你不断地循环它们,所有的都足够快。我严重怀疑数组循环是你的项目(或任何其他项目)的瓶颈。

2012年所有主流浏览器当前版本的更新答案- Chrome, Firefox, IE9, Safari和Opera支持ES5的原生array.forEach。

除非你有理由在本地支持IE8(记住ES5-shim或Chrome框架可以提供给这些用户,这将提供一个适当的JS环境),否则使用语言的正确语法会更干净:

myArray.forEach(function(item, index) {
    console.log(item, index);
});

array.forEach()的完整文档在MDN上。

如果你真的想加快你的代码,那该怎么做呢?

for( var i=0,j=null; j=array[i++]; foo(j) );

它有点像在for语句中有while逻辑而且它不那么冗余。firefox也有Array。forEach和Array.filter

选择应该基于哪个成语最容易理解。

使用以下方法迭代数组:

for (var i = 0; i < a.length; i++)
   //do stuff with a[i]

被用作关联数组的对象使用以下方法迭代:

for (var key in o)
  //do stuff with o[key]

除非你有惊天动地的理由,否则就坚持既定的使用模式。