在Javascript中迭代对象数组-为什么我不能在增量块中获得当前对象

Iterating over an array of objects in Javascript - why can't I obtain current object inside for increment block?

本文关键字:对象 迭代 Javascript 数组 为什么 不能      更新时间:2023-09-26

假设我有一个数组

var array = [
    {name: "woo"},
    {name: "yay"},
    {name: "hoopla"}
] 

为什么这个工作

for (var i=0; i<array.length; i++) {
    var item=array[i];
    alert(item.name) // woo, yay, hoopla
}

但这不是?

var item;
for (var i=0; i<array.length; item=array[i++]) {
    alert(item.name) // undefined
}

下面是一个比较不同答案速度的jsPerf测试用例:http://jsperf.com/different-ways-to-iterate-over-an-array-of-objects/2

在循环的第一次迭代中,item=array[i++]尚未执行,因此item仍然具有其初始值。for语句的第三部分在迭代之间执行,而不是在循环开始时执行。

应该可以了

var item;
for (var i=0; item=array[i], i<array.length; i++) {
    alert(item.name) // undefined
}

因为第一次通过循环,变量item没有被赋值

一个for语句有3部分,计数器(var i= 0;),限制(i<array.length;)和递增(i++;)>

把这些位想象成3行不同的代码。不过,这三行代码不是按顺序执行的,而是如下所示

  1. 执行'counter'并设置变量
  2. 检查'limit',如果布尔值为true,则执行大括号中的代码
  3. 执行大括号中的代码后,执行"incrementor"
  4. 循环从第二步开始重复,直到极限返回false

直到for循环的花括号中的代码被执行后,递增器的最后一位才会被执行,所以本质上,在那个时间点,item还没有被赋值。

因为在第一次迭代中item还没有定义,所以如果您将代码更改为:

for ( item=array[i=0]; i<array.length; item=array[++i] ) {
    alert(item.name)
}

JavaScript中另一种枚举对象数组的方法:

for(var item in array)
    alert(array[item])