可能重复:
对于(aArray中的变量i(VS对于(i=0;i<aArray.length;i++(
假设这些总是做同样的事情,而我应该总是使用后者,这安全吗?
for (var i = 0; i < a.length; i++){
for (var i in a){
不,这是不安全的,因为它们不是一回事。
第一个迭代数字索引,直到.length
属性中按数字顺序存储了任何值为止。
第二个枚举对象上的所有可枚举属性,包括原型化属性,并且不保证任何顺序。
采用阵列:
var arr = ['a','b','c'];
现在,为其构造函数的prototype
对象添加一些内容:
Array.prototype.sayHello = function() { alert('hi'); };
如果您使用for-in
语句,您最终将使用sayHello
函数,而不仅仅是数字索引。
如果您处理的对象除了索引之外没有可枚举属性,而且不关心顺序,那么我想这真的无关紧要,但正确的形式仍然是使用for
语句。
否,因为(假设在第一个版本中使用i
对a
进行索引(数组可以具有非整数索引。所以,如果你有:
a = {1:1, 'f': 'hey'}
在第一个版本中,i
将是0
,然后是1
。您应该先尝试用0
对a
进行索引,但由于0
不是有效的索引,因此不会得到任何结果,然后尝试使用1
并得到"嘿"。所以你可以看出这显然是错误的。
第二个将检查每一个指数,无论它是什么
因此,第一个版本假设所有索引都是按顺序的数字和,而第二个版本将迭代每个索引,无论它是什么。
否。
当您需要通过数组的自然顺序进行枚举时,请将前者用于数组。当排序不重要或不存在时,对对象使用后者。