【发布时间】:2011-08-28 20:28:45
【问题描述】:
是否可以假设它们总是做同样的事情,并且我应该总是使用后者?
for (var i = 0; i < a.length; i++){
for (var i in a){
【问题讨论】:
标签: javascript for-loop
是否可以假设它们总是做同样的事情,并且我应该总是使用后者?
for (var i = 0; i < a.length; i++){
for (var i in a){
【问题讨论】:
标签: javascript for-loop
不,这不安全,因为它们不是一回事。
第一个迭代数字索引,直到任何值按数字顺序存储在 .length 属性中。
第二个枚举对象的所有可枚举属性,包括原型属性,并且不保证任何顺序。
取一个数组:
var arr = ['a','b','c'];
现在向其构造函数的prototype 对象添加一些内容:
Array.prototype.sayHello = function() { alert('hi'); };
如果您使用for-in 语句,您最终会遇到sayHello 函数,而不仅仅是数字索引。
如果您正在处理除了索引之外没有可枚举属性的对象,并且您不关心顺序,那么我猜这真的无关紧要,但仍然可以使用正确的形式for 声明。
【讨论】:
for-in。 for 语句是正确的。
x = [[parent1, child1], [parent2, child2]...],for-in 循环就可以完成这项工作。 for (entry in x){ x[entry][0].appendChild(x[entry][1]); }
不,因为(假设在第一个版本中您使用i 来索引a)数组可以有非整数索引。所以如果你有:
a = {1:1, 'f': 'hey'}
在第一个版本中,i 将是 0,然后是 1。您首先尝试使用0 对a 进行索引,但由于0 不是有效索引,因此没有得到任何返回,然后尝试使用1 并得到“嘿”。所以你可以看到这显然是错误的。
第二个将遍历每个索引,无论它是什么。
所以第一个版本假定所有索引都是按顺序和的数字,而第二个版本将迭代每个索引,无论它是什么。
【讨论】:
没有。
当您需要通过数组的自然顺序进行枚举时,将前者用于数组。当排序不重要或不存在时,将后者用于对象。
【讨论】: