可能重复:
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>
答案 0 :(得分:2)
你可以使用你清楚理解的任何一个。对于数组,您可以同时使用这两种情况。
对于您可以使用的数组
for (var i = 0; i < a.length; i++){
//do something
}
可以使用的对象
for ( var i in obj){
//do something
}
因为你无法获得物体的长度。
答案 1 :(得分: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或虚幻编辑器的UnrealScript等程序中作为脚本语言运行,那么这不是一件好事。
您不在对象上使用iterator
的原因是因为您通常不会创建以下对象:
var obj = { "0" : "zero", "1" : "one", "2" : "two" };
即使你做了(例如jQuery做了类似的事情),你可能想要枚举基于单词的属性,但你不能,因为你在计算。
另外需要注意的是:enumerating
for ... 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%的时间“将”。
答案 2 :(得分:1)
这取决于你需要什么。我通常使用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循环会更快,因为变量增量是在内部完成的(即它不是Javascript语句,如“i ++”)。