可能重复:
JavaScript for…in vs for
difference between for..in and for loops, and counter declaration
是否有任何特殊原因,数组中的for循环应编码为for (var i = 0; i < foo.length; i++) {
,而对象中的循环只是for (var i in foo) {
是否因为对象的设置方式与数组的设置方式有关? (我知道数组是btw的一种对象)或者只是另一种挑剔的编程约定。
答案 0 :(得分:2)
在迭代列表时,您应该使用for(i=0; i<n; i++)
循环,因为可以按整数进行索引。
arr = [1,2,3,4]; // arr[0] == 1; arr[1] == 2;
for(var i=0; i<arr.length; i++) { alert(arr[i]; } // 1, 2, 3, 4
您在迭代对象时应使用for...in
循环,因为可按键进行索引。如果您将对象视为键:值映射。请记住检查对象是否具有与每个键匹配的属性,因为in
语句将检查对象的 proptotype链并返回从上面继承的属性名称
obj = {
foo: 1,
bar: 2
}
for(key in obj) {
if(obj.hasOwnProperty(key)) {
alert(key); // foo, bar
alert(obj[key]); // 1, 2
}
}
答案 1 :(得分:-1)
嗯,主要原因是因为for...in
只迭代定义的成员。
所以,
var arr = [];
arr[10] = "hi";
for(var x in arr)
{
alert(x);
}
仅显示 定义的一个值。有时这是件好事 - 通常不是。
此外,for...in
遍历属性,而不是数组索引(在javascript中,数组只是一个常规对象,其属性的名称是您为数组赋值的值)
所以当你使用for..in时,你会得到奇怪的结果,比如:
1
2
3
长度
的toString
等
使用典型的for
语法对于数组来说是更好的选择。对于对象,for...in
更有意义,因为未定义的问题不会经常出现。无论哪种方式,我都喜欢使用for(var x; x < y; x++)
语法。它在js中感觉更好。