【问题标题】:What is the different between for loop and for in loop in javascript [duplicate]javascript中for循环和for in循环有什么区别[重复]
【发布时间】:2012-08-03 05:41:21
【问题描述】:

可能重复:
JavaScript for…in vs for

我在我的函数中使用了一个 for 循环。我使用两种类型的循环,“for in”和“for”。两者都产生相同的结果,所以我想知道这些循环之间有什么区别以及如何知道应该使用哪个循环。

<script type="text/javascript">
var jam = ['amit','sam','ram','soly']
for(var i in jam){
alert(jam[i])
}
//for (i=0; i<jam.length; i++) {
//  jam[i]
//alert(jam[i].length)
//}
</script>
</head>
<body>
</body>

【问题讨论】:

    标签: javascript for-loop


    【解决方案1】:

    这取决于你需要什么。我通常使用 for-in 循环,因为它是一种较短的形式,但有时您可能希望控制迭代变量。例如,如果你想遍历 even 索引,你需要使用普通的 for 循环:

    for (var i = 0; i < myarray.length; i+=2) {...}
    

    这同样适用,例如,如果您想向后迭代:

    for (var i = myarray.length-1; i >= 0; i--) {...}
    

    当然,对于对象,for-in 循环允许您在迭代变量中获取属性名称。例如:

    var myobject = {year: 1992, city: "Barcelona"}
    for (var propname in myobject) alert(propname + " = " + myobject[propname]);
    

    在您的示例中,我会使用 for-in 因为您正在进行简单的迭代。此外,我认为在未优化的 Javascript 编译器/解释器中,for-in 循环会更快,因为变量增量是在内部完成的(即它不是诸如“i++”之类的 Javascript 语句)。

    【讨论】:

    • 一些在for循环外分配给对象键值的变量在循环内找不到,因此我建议在这种情况下使用for-in-loop。
    【解决方案2】:

    你可以使用任何你理解清楚的。对于数组,您可以同时使用这两种情况。

    对于你可以使用的数组

    for (var i = 0; i < a.length; i++){
      //do something
    }
    

    你可以使用的对象

    for ( var i in obj){
      //do something
    }
    

    因为你无法获得对象的长度。

    【讨论】:

      【解决方案3】:

      for 循环用于iterate,同时递增/递减。

      // note that I'm making this big and ugly to show what's going on
      var incrementor = 1, length = 10,
          array = [ "one", "two", "three", "four", "five",
                    "six", "seven", "eight", "nine", "ten" ];
      
      for (; incrementor <= length; incrementor = incrementor + 1) {
          console.log(incrementor);  // 1,2,3,...,10
          console.log( array[incrementor - 1] );  // "one", "two", "three", ..., "ten"
      }
      

      for ... in ... 循环旨在通过对象属性指向enumerate

      var object = { "key1" : "one", "key2" : "two", "key3" : "three" },
          key = "";
      
      for (key in object) {
          console.log(key); // "key1", "key2", "key3"
          console.log( object[key] ); // "one", "two", "three"
      }
      

      您将for 用于数组的原因是因为在不良浏览器上,for ... in ... 不仅可以包含数字属性(即:key=0, key=1,...),还可以枚举您不希望它包含的内容... ...喜欢key=splice, key=length, key=unshift。 如果您在专业网站上运行此代码,或者在特定硬件上运行的专用 JS 版本,或者在 Unity 或 Unreal Editor 的 UnrealScript 等程序中作为脚本语言运行,这并不是一件好事。

      您不在对象上使用iterator 的原因是因为您通常不会制作像这样的对象:

      var obj = { "0" : "zero", "1" : "one", "2" : "two" };
      

      即使你这样做了(例如,jQuery 做了类似的事情),你可能想要枚举基于单词的属性,但你不能,因为你在计数。

      还需要注意:enumeratingfor ... in ... 的功能没有标准化。 这意味着不能 100% 保证按照您期望的顺序吐出这些值。 如果您依赖循环运行0,1,2,3,...,那么for ... in ... 不能保证 100% 的浏览器会在 100% 的时间里这样做——即使大多数浏览器在大多数情况下都能做到这一点。

      现在,他们最常遵循先进先出规则。 如果你像{ one : 1, two : 2, three : 3 } 这样构建你的对象,任何现代浏览器都会打印1,2,3。如果你像这样构建对象:{ two: 2, one: 1, six: 6 },你会得到2,1,6

      但这是 95% 的时间“应该”,而不是 100% 的时间“将”。

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 2019-10-01
        • 2021-06-28
        • 2012-08-30
        • 1970-01-01
        • 2016-02-08
        • 2011-04-01
        • 1970-01-01
        • 2017-01-05
        相关资源
        最近更新 更多