【问题标题】:for (var i = 0; i < a.length; i++){ vs. for (var i in a){ [duplicate]for (var i = 0; i < a.length; i++){ vs. for (var i in a){ [重复]
【发布时间】:2011-08-28 20:28:45
【问题描述】:

可能重复:
for(var i in aArray) VS for(i=0; i<aArray.length; i++)

是否可以假设它们总是做同样的事情,并且我应该总是使用后者?

for (var i = 0; i &lt; a.length; i++){

for (var i in a){

【问题讨论】:

    标签: javascript for-loop


    【解决方案1】:

    不,这不安全,因为它们不是一回事。

    第一个迭代数字索引,直到任何值按数字顺序存储在 .length 属性中。

    第二个枚举对象的所有可枚举属性,包括原型属性,并且不保证任何顺序。

    取一个数组:

    var arr = ['a','b','c'];
    

    现在向其构造函数的prototype 对象添加一些内容:

    Array.prototype.sayHello = function() { alert('hi'); };
    

    如果您使用for-in 语句,您最终会遇到sayHello 函数,而不仅仅是数字索引。


    如果您正在处理除了索引之外没有可枚举属性的对象,并且您不关心顺序,那么我猜这真的无关紧要,但仍然可以使用正确的形式for 声明。

    【讨论】:

    • 触摸!我应该更具体。我的意思是当我处理矩阵时。
    • @Artur 你所说的矩阵是指一个数组数组,对吧? (因为 JavaScript 中没有内置的矩阵类型/类)
    • 是的!抱歉,我的意思是其中包含数组的数组,或者我想甚至是单层数组。
    • @Artur Sapek:在这种情况下,不要在 JavaScript 中的数组上使用 for-infor 语句是正确的。
    • @patrick dw 这就是我的意思,但在我的代码中,它们在几种情况下都做同样的事情。如果我将 DOM 元素应用到数组中的父级:x = [[parent1, child1], [parent2, child2]...]for-in 循环就可以完成这项工作。 for (entry in x){ x[entry][0].appendChild(x[entry][1]); }
    【解决方案2】:

    不,因为(假设在第一个版本中您使用i 来索引a)数组可以有非整数索引。所以如果你有:

    a = {1:1, 'f': 'hey'}
    

    在第一个版本中,i 将是 0,然后是 1。您首先尝试使用0a 进行索引,但由于0 不是有效索引,因此没有得到任何返回,然后尝试使用1 并得到“嘿”。所以你可以看到这显然是错误的。

    第二个将遍历每个索引,无论它是什么。

    所以第一个版本假定所有索引都是按顺序的数字,而第二个版本将迭代每个索引,无论它是什么。

    【讨论】:

      【解决方案3】:

      没有。

      当您需要通过数组的自然顺序进行枚举时,将前者用于数组。当排序不重要或不存在时,将后者用于对象。

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 2014-09-17
        • 2015-10-09
        • 1970-01-01
        • 2019-11-07
        相关资源
        最近更新 更多