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

yxf*_*xmx 5 javascript arrays for-in-loop

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

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

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

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

Col*_*t89 6

这是有效的,因为for循环将值分配给o左边的变量in.

通常这将是一个用于某些功能的新变量.例如for(var a in o){/* do something with a */}

在这种情况下其分配到a[i++]其中i++通过每次1增加

值得指出的是,;for(a[i++] in o) /* empty */; 此关闭每一次迭代的重要性for.没有它,下一行/循环(无论它可能是什么)将被重复.


hug*_*omg 3

哇,我真的很惊讶这段代码的工作原理!我只想说,我不建议使用它,并且希望这种a[i++]诡计出现在古老的 C 中,而不是 Javascript 中:)

至于为什么它有效,这与语言的语法有关。for 循环的语法是:

for ( LeftHandSideExpression in Expression ) Statement
Run Code Online (Sandbox Code Playgroud)

LeftHandSideExpression是您可以使用运算分配的任何内容=。在 for 循环中,通常我们只使用变量标识符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
Run Code Online (Sandbox Code Playgroud)