你认为……有很大的不同吗?In和for循环?你更喜欢用哪种for ?为什么?
假设我们有一个关联数组数组:
var myArray = [{'key': 'value'}, {'key': 'value1'}];
所以我们可以迭代:
for (var i = 0; i < myArray.length; i++)
And:
for (var i in myArray)
我看不出有什么大的不同。是否存在性能问题?
你认为……有很大的不同吗?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';
}
});
我只是做了这个,所以我愿意听取建议:)