2014-09-02 58 views
5

`我在读“JavaScript的:权威指南”,我越来越挂了一个例子:复制对象属性到数组与空体,在循环

“你可以使用类似代码下面的所有对象属性的名称复制到一个数组”

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

我不明白,为什么最后一行真正做任何事情,没有说明为什么它填补了数组?

+0

两点意见:1),如果它做什么它打算这样做,何必呢? 2)这个代码,每个维护人员都会立即跳出窗口... – 2014-09-02 14:04:33

+5

因为'a [i ++]'是'o'的每个键被分配给的。通常你会使用一个变量,但是你使用的是数组成员。同样的操作。 – 2014-09-02 14:05:09

+0

我只是想明白,为什么它的作品。我无意按现状使用它。它看起来像循环体是空的它不应该填充数组,所以它为什么'做它打算做'? – yxfxmx 2014-09-02 14:06:31

回答

3

哇,我真的很惊讶,这段代码的作品!让我只是说,我不会推荐使用它,并期望这种a[i++]欺骗显示在古代C,而不是在Javascript中:)

至于为什么它的工作原理,它与语法语言。该syntax for a for Loop是:

for (LeftHandSideExpression in Expression) Statement 

一个LeftHandSideExpression是什么,你可以指定与=运营商。在for循环中,通常我们只使用variable identifier,如for(k in o),但由于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 
+0

Check here:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in在循环的每次迭代中,LHS表达式都被分配了RHS的属性。在这种情况下,它是数组中的i + 1元素。循环没有主体这一事实与JS无关,并且由于数组是在循环范围之外定义的,所以循环迭代所产生的所有元素都可用。 – 2014-09-02 15:08:09

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

东西是for in loops如何工作。您可以指定任意左手表达式作为分配键的引用。通常它只是对变量的引用,但您也可以使用属性表达式,例如a[i++]

从规格:

  1. ...
  2. lhsRef是评估LeftHandSideExpression可以评估反复)的结果。
  3. 致电PutValue(lhsRef, P)
  4. ...

也许代码更容易写成

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