Javascript 将对象属性复制到循环中具有空主体的数组
`我正在读《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的每一
我不明白,为什么最后一行在没有指令的情况下真的会做任何事情。为什么它会填充数组?这是有效的,因为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++;