`我正在阅读'JavaScript:权威指南',我会挂上一个例子:
“您可以使用以下代码将所有对象属性的名称复制到数组中”
var o = {x:1, y:2, z:3};
var a = [], i = 0;
for(a[i++] in o) /* empty */;
我不明白,为什么最后一行真的做了什么,没有说明。为什么它会填满阵列?
答案 0 :(得分:6)
这是有效的,因为for循环会将o
中的值分配给in
左侧的变量。
通常这将是一个用于某些功能的新变量。例如for(var a in o){/* do something with a */}
在这种情况下,它会将a[i++]
分配给i++
每次增加1
还值得指出;
for(a[i++] in o) /* empty */;
的重要性
这将关闭for
的每次迭代。没有它,下一行/循环(无论它可能是什么)将被重复。
答案 1 :(得分:3)
a[i++]
技巧出现在古代C中,而不是在Javascript中:)
至于它为何起作用,它与语言的语法有关。 syntax for a for Loop是:
for ( LeftHandSideExpression in Expression ) Statement
LeftHandSideExpression是您可以使用=
运算符分配的任何内容。在for循环中,通常我们只使用for(k in o)
中的variable identifier,但由于arr[i]
也是有效的LHS表达式(您可以arr[i] =
),我们也可以写for(arr[i] in o)
。
最后,你的循环与
类似var a=[], i=0;
a[i++] = "x";
a[i++] = "y";
a[i++] = "z";
// in the end, a should be ["x", "y", "z"]
// and i should be 3
答案 2 :(得分:1)
这就是for in
loops的工作方式。您可以指定任意左手表达式作为分配键的引用。通常它只是对变量的引用,但您也可以使用属性表达式,例如a[i++]
。
来自规范:
- ...
- 让
lhsRef
成为评估LeftHandSideExpression
(可能会重复评估)的结果。- 致电
PutValue(lhsRef, P)
。- ...
醇>
也许代码更容易编写为
for(a[i] in o) i++;