Javascript 将对象属性复制到循环中具有空主体的数组

Javascript 将对象属性复制到循环中具有空主体的数组,javascript,arrays,for-in-loop,Javascript,Arrays,For In Loop,`我正在读《JavaScript:权威指南》,我正在读一个例子: “您可以使用如下代码将所有对象属性的名称复制到数组中” 我不明白,为什么最后一行在没有指令的情况下真的会做任何事情。为什么它会填充数组?这是有效的,因为for循环将o中的值分配给中左侧的变量 通常,这将是一个新变量,用于某些函数中。例如,for(var a in o){/*使用*/} 在这种情况下,它将其分配给a[i++],其中i++每次增加1 还值得指出的是中的;对于(o中的[i++]a/*empty*/; 这将关闭for的每一

`我正在读《JavaScript:权威指南》,我正在读一个例子:

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


我不明白,为什么最后一行在没有指令的情况下真的会做任何事情。为什么它会填充数组?

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

通常,这将是一个新变量,用于某些函数中。例如,
for(var a in o){/*使用*/}

在这种情况下,它将其分配给
a[i++]
,其中
i++
每次增加1

还值得指出的是
中的
对于(o中的[i++]a/*empty*/;

这将关闭
for
的每一次迭代。没有它,下一行/循环(无论它是什么)都会重复。

哇,我真的很惊讶这段代码能工作!我只想说,我不建议使用它,我希望这种
欺骗会出现在古C中,而不是Javascript中:)

至于它为什么会起作用,这与语言的语法有关

A是可以通过
=
运算符分配给的任何对象。在for循环中,通常我们只使用
中的as for(k In o)
,但是由于
arr[i]
也是一个有效的LHS表达式(可以执行
arr[i]=
),我们也可以为(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
这就是工作原理。您可以指定任意左手表达式作为分配键的引用。通常它只是对变量的引用,但您也可以使用属性表达式,例如
a[i++]

根据规范:

  • lhsRef
    作为计算
    leftHandside表达式的结果(可以重复计算它)
  • 调用
    PutValue(lhsRef,P)
  • 也许代码编写起来更简单

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

    两条注释:1)如果它做了它想要做的事情,为什么要麻烦呢?2)这段代码每个维护人员都会立即导致跳出窗口…因为
    a[i++]
    o
    的每个键所分配的。通常你会使用一个变量,但你使用的是数组成员。相同的操作。我只是想了解,为什么它会工作。我不打算按原样使用它。它看起来就像循环体是空的,不应该填充数组,那么为什么它“做它想做的事”?想想ab了解
    for…in
    的工作原理。在循环的每次迭代中,
    in
    左侧的变量都被分配一个对象键。在JavaScript中,作为对象属性引用是合法的,
    i
    的自动递增意味着在循环的每次迭代中都有一个不同的
    a
    在实际代码中,被赋予一个值…和FWIW,您只需使用
    Object.keys(o)
    ,几乎完全相同。检查这里:在循环的每次迭代中,LHS表达式都被分配了RHS的属性。在这种情况下,它是数组的i+1元素。循环没有实体这一事实对JS来说并不重要,因为数组是在循环范围之外定义的,所以它和所有由循环是可用的。
    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
    
    for(a[i] in o) i++;