2

可能重复:
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>
4

3 回答 3

2

这取决于你需要什么。我通常使用 for-in 循环,因为它是一种较短的形式,但有时您可能希望控制迭代变量。例如,如果要遍历偶数索引,则需要使用普通的 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 语句)。

于 2012-08-03T06:19:34.083 回答
2

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 等程序中作为脚本语言运行,这并不是一件好事。

您不使用iteratoron 对象的原因是因为您通常不会制作如下对象:

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

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

同样重要的是要注意:enumeratingwithfor ... 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% 的时间“将”。

于 2012-08-03T06:29:40.670 回答
2

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

对于您可以使用的数组

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

对于您可以使用的对象

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

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

于 2012-08-03T05:46:40.993 回答