可能重复:
JavaScript for...in vs for
for..in 和 for 循环之间的区别,以及计数器声明
是否有任何特殊原因应该像数组中的 for 循环那样编码,for (var i = 0; i < foo.length; i++) {
而对象中的循环只是for (var i in foo) {
因为对象的设置方式与数组的设置方式?(我知道数组是一种对象顺便说一句)或者只是另一个挑剔的编程约定。
可能重复:
JavaScript for...in vs for
for..in 和 for 循环之间的区别,以及计数器声明
是否有任何特殊原因应该像数组中的 for 循环那样编码,for (var i = 0; i < foo.length; i++) {
而对象中的循环只是for (var i in foo) {
因为对象的设置方式与数组的设置方式?(我知道数组是一种对象顺便说一句)或者只是另一个挑剔的编程约定。
迭代列表时应该使用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
迭代对象时应该使用循环,因为它可以按键索引。如果您将对象视为键:值映射。请记住检查对象是否具有与每个 key 匹配的自己的属性,因为该in
语句将检查对象的proptotype 链并返回从上面继承的属性名称。
obj = {
foo: 1,
bar: 2
}
for(key in obj) {
if(obj.hasOwnProperty(key)) {
alert(key); // foo, bar
alert(obj[key]); // 1, 2
}
}
嗯,主要原因是因为for...in
只迭代定义的成员。
所以,
var arr = [];
arr[10] = "hi";
for(var x in arr)
{
alert(x);
}
只会显示定义的一个值。有时这是一件好事——通常不是。
此外,for...in
循环遍历属性,而不是数组索引(在 javascript 中,数组只是一个具有属性的常规对象,其名称是您分配给数组的值)
因此,当您使用 for..in 时,您会得到奇怪的结果,例如:
1
2
3
长度
等等
使用典型for
语法只是数组的更好选择。对于对象,这for...in
更有意义,因为未定义的问题不会经常出现。不过,无论哪种方式,我都喜欢使用for(var x; x < y; x++)
语法。只是感觉在js中更好。