javascript中for循环和for in循环有什么不同

javascript中for循环和for in循环有什么不同,javascript,for-loop,Javascript,For Loop,可能重复: 我在函数中使用for循环。我使用两种类型的循环,“用于in”和“用于”。两者都产生相同的结果,所以我想知道这些循环之间的区别,以及如何知道应该使用哪个循环。 变量jam=['amit'、'sam'、'ram'、'soly'] 用于(jam中的var i){ 警报(堵塞[i]) } //对于(i=0;i您可以使用您清楚理解的任何一种。对于数组,您可以同时使用这两种情况 对于可以使用的阵列 for (var i = 0; i < a.length; i++){ //do

可能重复:

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


变量jam=['amit'、'sam'、'ram'、'soly']
用于(jam中的var i){
警报(堵塞[i])
}

//对于(i=0;i您可以使用您清楚理解的任何一种。对于数组,您可以同时使用这两种情况

对于可以使用的阵列

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

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

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

for (var i = 0; i < myarray.length; i+=2) {...}
当然,对于对象,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
循环意味着在递增/递减时进行迭代

// 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
for数组的原因是,在糟糕的浏览器上,
for…in…
不仅可以包含数字属性(即:
key=0,key=1,
),还可以枚举您不希望它发生的事情……比如
key=splice,key=length,key=unshift
。 如果您在专业站点上运行此代码,或者在特定硬件上运行JS的专用版本,或者在Unity或Unreal Editor的UnrealScript之类的程序中作为脚本语言运行,那么这并不是一件好事

您不在对象上使用
迭代器
的原因是,您通常不会生成如下对象:

var obj = { "0" : "zero", "1" : "one", "2" : "two" };
即使您这样做了(例如jQuery做了类似的事情),也可能有一些基于单词的属性需要枚举,但您不能,因为您正在计数

同样重要的是要注意:
使用
枚举
的功能未标准化。 这意味着不能100%保证按照您期望的顺序输出值。 如果你依赖于你的循环
0,1,2,3,…
那么
for…in…
不能保证100%的浏览器都会这样做,100%的时间-即使大多数浏览器大部分时间都做对了

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


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

在该循环中找不到分配给for循环外部对象键值的某些变量,因此我建议在这种情况下使用for in循环。
// 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"
}
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"
}
var obj = { "0" : "zero", "1" : "one", "2" : "two" };