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

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

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

所以我们可以迭代:

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

And:

for (var i in myArray)

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


当前回答

两者之间有一个重要的区别。for-in迭代对象的属性,所以当case是一个数组时,它不仅会迭代它的元素,还会迭代它的“remove”函数。

for (var i = 0; i < myArray.length; i++) { 
    console.log(i) 
}

//Output
0
1

for (var i in myArray) { 
    console.log(i) 
} 

// Output
0 
1 
remove

你可以在if(myArray.hasOwnProperty(i))中使用for-in。不过,在数组上迭代时,我总是倾向于避免这种情况,只使用for(;;)语句。

其他回答

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

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

小心!

例如,如果你有几个脚本标签,你正在标签属性中搜索信息,你必须使用.length属性和for循环,因为它不是一个简单的数组,而是一个HTMLCollection对象。

https://developer.mozilla.org/en/DOM/HTMLCollection

如果你使用foreach语句for(var i in yourList),它将在大多数浏览器中返回HTMLCollection的属性和方法!

var scriptTags = document.getElementsByTagName("script");

for(var i = 0; i < scriptTags.length; i++)
alert(i); // Will print all your elements index (you can get src attribute value using scriptTags[i].attributes[0].value)

for(var i in scriptTags)
alert(i); // Will print "length", "item" and "namedItem" in addition to your elements!

即使getElementsByTagName应该返回一个节点列表,大多数浏览器都返回一个HTMLCollection: https://developer.mozilla.org/en/DOM/document.getElementsByTagName

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

使用以下方法迭代数组:

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

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

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

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

小心! ! 我在Mac OS中使用Chrome 22.0,我在每个语法上都有问题。

我不知道这是浏览器问题,javascript问题或代码中的一些错误,但这是非常奇怪的。在物体之外,它工作得很完美。

var MyTest = {
    a:string = "a",
    b:string = "b"
};

myfunction = function(dicts) {
    for (var dict in dicts) {
        alert(dict);
        alert(typeof dict); // print 'string' (incorrect)
    }

    for (var i = 0; i < dicts.length; i++) {
        alert(dicts[i]);
        alert(typeof dicts[i]); // print 'object' (correct, it must be {abc: "xyz"})
    }
};

MyObj = function() {
    this.aaa = function() {
        myfunction([MyTest]);
    };
};
new MyObj().aaa(); // This does not work

myfunction([MyTest]); // This works

使用Array()。forEach循环利用并行性