使用空主体for-in循环将对象属性复制到数组

时间:2014-09-02 14:00:04

标签: javascript arrays for-in-loop

`我正在阅读'JavaScript:权威指南',我会挂上一个例子:

“您可以使用以下代码将所有对象属性的名称复制到数组中”

var o = {x:1, y:2, z:3};
var a = [], i = 0;
for(a[i++] in o) /* empty */;

我不明白,为什么最后一行真的做了什么,没有说明。为什么它会填满阵列?

3 个答案:

答案 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++]

来自规范:

  
      
  1. ...
  2.   
  3. lhsRef成为评估LeftHandSideExpression可能会重复评估)的结果。
  4.   
  5. 致电PutValue(lhsRef, P)
  6.   
  7. ...
  8.   

也许代码更容易编写为

for(a[i] in o) i++;