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

Art*_*pek 2 javascript for-loop

可能重复:
for(var in aArray)VS for(i = 0; i <aArray.length; i ++)

假设这些总是会做同样的事情,并且我应该总是使用后者,这是安全的吗?

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

for (var i in a){

use*_*716 7

不,它不安全,因为它们不是一回事.

第一个迭代数字索引,直到.length以数字顺序存储在属性中的任何值.

第二个枚举对象的所有可枚举属性,包括原型属性,并不保证任何类型的顺序.

拿一个数组:

var arr = ['a','b','c'];
Run Code Online (Sandbox Code Playgroud)

现在添加一些东西到prototype它的构造函数的对象:

Array.prototype.sayHello = function() { alert('hi'); };
Run Code Online (Sandbox Code Playgroud)

如果你使用一个for-in语句,你最终会击中sayHello函数,而不仅仅是数字索引.


如果你正在处理除了索引之外没有可枚举属性的对象,并且你不关心顺序,那么我猜它真的没关系,但是正确的形式仍然是使用for语句.