【问题标题】:Copying object properties to array with an empty body for-in loop使用空体 for-in 循环将对象属性复制到数组
【发布时间】:2014-10-26 19:56:27
【问题描述】:

`我正在阅读“JavaScript:权威指南”,我正在关注一个示例:

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

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

我不明白,为什么最后一行真的做任何事情,没有说明。为什么会填满数组?

【问题讨论】:

  • 两个 cmets:1) 如果它完成了它的预期,为什么还要麻烦? 2)每个维护者都会立即导致跳出窗口的这段代码......
  • 因为a[i++] 是o 的每个键所分配的。通常你会使用一个变量,但你使用的是数组成员。同样的操作。
  • 我只是想了解它为什么有效。我无意按原样使用它。它看起来就像循环体是空的,它不应该填充数组,那么为什么它“做它打算做的事情”呢?
  • 想想for ... in 是如何工作的。 in 左侧的变量在循环的每次迭代中分配对象的键。在 JavaScript 中将其作为对象属性引用是合法的,i 的自动增量意味着在循环的每次迭代中,a 的 不同 属性被分配了一个值。
  • ...而 FWIW,在实际代码中,您只需使用 Object.keys(o),这几乎是相同的。

标签: javascript arrays for-in-loop


【解决方案1】:

这是可行的,因为 for 循环将 o 中的值分配给 in 左侧的变量。

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

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

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

【讨论】:

    【解决方案2】:

    哇,我真的很惊讶这段代码可以工作!我只想说我不建议使用它,并且希望这种 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
    

    【讨论】:

    • 检查这里:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 在循环的每次迭代中,LHS 表达式都被分配了 RHS 的一个属性。在这种情况下,它是数组的 i+1 元素。循环没有主体这一事实对 JS 来说并不重要,并且由于数组是在循环范围之外定义的,因此它和循环迭代产生的所有元素都是可用的。
    【解决方案3】:

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

    来自规范:

    1. …
    2. 让lhsRef 成为评估LeftHandSideExpression 的结果(可以重复评估)。
    3. 致电PutValue(lhsRef, P)。
    4. …

    也许代码更容易写成

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 2021-11-13
      • 2015-03-16
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2015-07-28
      相关资源
      最近更新 更多