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

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

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

所以我们可以迭代:

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

And:

for (var i in myArray)

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


当前回答

当数组稀疏时,这两者是不一样的。

var array = [0, 1, 2, , , 5];

for (var k in array) {
  // Not guaranteed by the language spec to iterate in order.
  alert(k);  // Outputs 0, 1, 2, 5.
  // Behavior when loop body adds to the array is unclear.
}

for (var i = 0; i < array.length; ++i) {
  // Iterates in order.
  // i is a number, not a string.
  alert(i);  // Outputs 0, 1, 2, 3, 4, 5
  // Behavior when loop body modifies array is clearer.
}

其他回答

数组上的For in循环与Prototype不兼容。如果您认为将来可能需要使用该库,那么坚持使用for循环是有意义的。

http://www.prototypejs.org/api/array

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

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

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

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

Douglas Crockford建议在JavaScript: The Good Parts(第24页)中避免使用for in语句。

如果使用for in遍历对象中的属性名,则结果是无序的。更糟的是:你可能会得到意想不到的结果;它包括从原型链继承的成员和方法名。

除了属性以外的所有内容都可以用. hasownproperty过滤掉。这个代码样例做了你最初可能想要的:

for (var name in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, name)) {
        // DO STUFF
    }
}

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上。

这是我做的事情。

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

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