2012-08-03 95 views
0

可能重复不同:
JavaScript for…in vs for什么是循环之间的循环中在javascript

我使用的是在我的函数循环。我使用两种类型的循环,“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> 

回答

1

这取决于你需要什么。我通常使用for-in循环,因为它是一种较短的形式,但有时您可能想要控制迭代变量。举例来说,如果你想遍历甚至指数,你需要使用正常的循环:

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 ++”)。

+0

在这个循环中找不到一个在for循环之外的对象键值的变量,因此我建议在这种情况下使用for-in-loop。 – 2018-02-02 15:17:33

2

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

的阵列可以使用

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

的对象,你可以使用

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

因为你不能得到物体的长度。

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

的原因你没有使用对象上的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%的时间“将”。