for (var i = 0; i < a.length; i++){ vs. for (var i in a){



可能重复:
对于(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语句。

否,因为(假设在第一个版本中使用ia进行索引(数组可以具有非整数索引。所以,如果你有:

a = {1:1, 'f': 'hey'}

在第一个版本中,i将是0,然后是1。您应该先尝试用0a进行索引,但由于0不是有效的索引,因此不会得到任何结果,然后尝试使用1并得到"嘿"。所以你可以看出这显然是错误的。

第二个将检查每一个指数,无论它是什么

因此,第一个版本假设所有索引都是按顺序的数字,而第二个版本将迭代每个索引,无论它是什么。

否。

当您需要通过数组的自然顺序进行枚举时,请将前者用于数组。当排序不重要或不存在时,对对象使用后者。

最新更新