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

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

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

所以我们可以迭代:

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

And:

for (var i in myArray)

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


当前回答

小心! ! 我在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

其他回答

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

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

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

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

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

根据jsperf,更短且最好的代码是

keys  = Object.keys(obj);
for (var i = keys.length; i--;){
   value = obj[keys[i]];// or other action
}

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

使用以下方法迭代数组:

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

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

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

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

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

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 (var i in myArray)你也可以遍历对象,i将包含键名,你可以通过myArray[i]访问属性。另外,你添加到对象中的任何方法都将包含在循环中,也就是说,如果你使用任何外部框架,如jQuery或prototype,或者如果你直接向对象原型添加方法,在某一点上,我将指向那些方法。