`我在读“JavaScript的:权威指南”,我越来越挂了一个例子:复制对象属性到数组与空体,在循环
“你可以使用类似代码下面的所有对象属性的名称复制到一个数组”
var o = {x:1, y:2, z:3};
var a = [], i = 0;
for(a[i++] in o) /* empty */;
我不明白,为什么最后一行真正做任何事情,没有说明为什么它填补了数组?
`我在读“JavaScript的:权威指南”,我越来越挂了一个例子:复制对象属性到数组与空体,在循环
“你可以使用类似代码下面的所有对象属性的名称复制到一个数组”
var o = {x:1, y:2, z:3};
var a = [], i = 0;
for(a[i++] in o) /* empty */;
我不明白,为什么最后一行真正做任何事情,没有说明为什么它填补了数组?
哇,我真的很惊讶,这段代码的作品!让我只是说,我不会推荐使用它,并期望这种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
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
这因为for循环将o
中的值分配给变量在in
的左边。
通常这是在某些功能中使用的新变量。例如for(var a in o){/* do something with a */}
在这种情况下它分配它a[i++]
,其中每个时间
的i++
增加1还值得指出的;
的重要性在for(a[i++] in o) /* empty */;
此关闭for
的每次迭代。没有它,下一行/循环(不管它是什么)会被重复。
东西是for in
loops如何工作。您可以指定任意左手表达式作为分配键的引用。通常它只是对变量的引用,但您也可以使用属性表达式,例如a[i++]
。
从规格:
- ...
- 让
lhsRef
是评估LeftHandSideExpression
(可以评估反复)的结果。- 致电
PutValue(lhsRef, P)
。- ...
也许代码更容易写成
for(a[i] in o) i++;
两点意见:1),如果它做什么它打算这样做,何必呢? 2)这个代码,每个维护人员都会立即跳出窗口... – 2014-09-02 14:04:33
因为'a [i ++]'是'o'的每个键被分配给的。通常你会使用一个变量,但是你使用的是数组成员。同样的操作。 – 2014-09-02 14:05:09
我只是想明白,为什么它的作品。我无意按现状使用它。它看起来像循环体是空的它不应该填充数组,所以它为什么'做它打算做'? – yxfxmx 2014-09-02 14:06:31