for循环和for之间的区别
我发现javascript中的for循环和for-in循环有区别。
当我定义一个新的数组时:
var a=new Array();
然后我给一些价值,但不是连续的,例如:
a[0]=0;a[1]=1;a[4]=4;
当我使用for(i=0;i<5;i++)
来获取值并使用alert来显示它时,它与使用for(i in a)
。
前一个将显示索引2,3中的元素,显示“undefined”,而for-in只显示索引0,1和4.有人可以告诉我为什么?
for (... in ...)
通常用于遍历对象的属性(这是javaScript用于关联数组的属性),而典型的for
循环用于顺序数组。
在你的例子中,你真的用键0,1和4创建了一个关联数组。如果你想要一个真正的javaScript数组,你可以使用a.push(0)
, a.push(1)
等。 。为了将值依次添加到数组的末尾。
使用顺序数组时, for (var i = 0; i < arr.length; i++)
的语法使得i
从0到1的数量小于数组的长度。 这将允许i
接一个地等于数组中的每个索引,从而允许您访问该数组中的每个元素。
但是,对于关联数组,键是非顺序的,因此将变量数“从0减少到小于数组长度1”不会产生所需的结果。 在你的例子中,它接近工作,因为你手动创建的键恰好是0,1和4,这几乎是连续的。
如果你想有一个非顺序键的数组 - 如0,1,4等那样的“非连续的” - 你应该使用对象而不是数组,例如
var obj = {};
obj[0] = 0;
obj[1] = 1;
obj[4] = 4;
然后使用for (... in ...)
循环将是正确的语法。
For循环对它们进行迭代,直到我达到5,所以i = 0,1,2,3,4,5并遍历所有。 但是for ... in循环迭代它们的属性只有0到5,但是你已经定义了0,1,4。
来自MDN:
注意: for..in不应该用于迭代索引顺序非常重要的数组。
数组索引只是具有整数名称的枚举属性,并且与其他常规对象属性相同。 不能保证for ... in将以任何特定顺序返回索引,并且它将返回所有可枚举的属性,包括具有非整数名称和那些被继承的属性。
由于迭代顺序与实现相关,迭代数组可能无法以一致的顺序访问元素。 因此,在遍历访问顺序非常重要的数组上进行迭代时,最好使用带有数字索引(或Array.forEach或for ... of循环)的for循环。
for-in循环枚举变量的枚举属性。 对于你的数组,“0”,“1”和“4”被添加为数组上的enumerable属性。 因此,for-in循环仅在“i”中获得0,1和4。
for循环与i = 0到5一起工作,因此您尝试访问2和3处的值以及显然未定义的值。
链接地址: http://www.djcxy.com/p/70099.html