有人可以用外行的方式向我解释循环中发生的事情,因为它迭代生成语句(对象属性在数组中)。
var o = {x:1, y:2, z:3};
var a = [], i = 0;
for (a[i++] in o)
{
console.log(o);
}
有人可以用外行的方式向我解释循环中发生的事情,因为它迭代生成语句(对象属性在数组中)。
var o = {x:1, y:2, z:3};
var a = [], i = 0;
for (a[i++] in o)
{
console.log(o);
}
这是评估 for/in 循环的方式:
for each property in object o
assign the property name to the left hand side, that is a[i++]
最初i = 0
,所以:
a[0]
会得到x
。// 注意它获取的是属性名,而不是它的值a[1]
会得到y
。a[2]
会得到z
。注意: i++
等于i = i + 1
。
前面的代码等价于以下代码:
var o = {x:1, y:2, z:3};
var a = []
var i = 0;
for (propertyName in o)
{
a[i] = propertyName;
i = i + 1;
console.log(o);
}
它将具有三个键 (x,y,z) 的对象分配给o
。它将一个空数组分配给a
,并将数字 0 分配给i
。
循环将for ( in )
遍历对象的属性,但首先评估条件。
i++
首先被评估。The++
是一个后增量运算符,因人们把该死的事情弄错而臭名昭著。Douglass Crockford(搜索他)建议不要使用它。它返回存储在i
(0)中的值,然后递增它。
所以现在我正在存储 1,我们正在评估 a[0],它正在访问数组中的一个元素,除了......那个数组是空的(我们正在访问一个未定义的值)。
它现在查看in o
,它遍历 中的键o
,其中有 3 个。因此,它迭代循环三次。然后每次将对象记录到控制台。
无论这段代码是什么,我都建议替换它。它不应该是你想在代码中看到的东西。这很令人困惑,肯定不会做任何有意义的事情。