【问题标题】:what is for....in statement in javascript什么是……在javascript中的声明
【发布时间】:2011-06-01 08:43:32
【问题描述】:

任何人都可以解释如何在 javascript 中使用 for...in 语句。我已经阅读了 w3school 的文章,但我认为它不是很清楚。下面是代码,请解释一下:

<html>
<body>
<script type="text/javascript">
var x;
var mycars = new Array();
mycars[10] = "Saab";
mycars[20] = "Volvo";
mycars[30] = "BMW";

for (x in mycars)
{
document.write(mycars[x] + "<br />");
}
</script>
</body>
</html>

【问题讨论】:

    标签: javascript for-in-loop


    【解决方案1】:

    for in loop 将遍历对象中的每个属性。

    在您的示例中,x 变量将循环遍历 mycars 对象中的每个属性。

    如果你添加mycars.expensive = "Porsche";,它也会找到。


    请注意,正如MDC 所述,for in 循环不应用于遍历普通数组:

    虽然它可能很诱人 这是一种迭代Array的方法, 这是一个坏主意。这 for...in声明 迭代用户定义的属性 除了数组元素,所以 如果你修改数组的非整数 或非正属性(例如,通过 添加"foo" 属性 甚至通过添加一个方法或 财产 Array.prototype), for...in 声明将 返回您的用户定义的名称 除了数字的属性 索引。另外,因为顺序 迭代是任意的,迭代 数组可能不会访问其中的元素 数字顺序。因此最好是 使用带有数字索引的传统 for 循环 遍历数组。相似的 论点甚至可能被用来反对 完全使用 for...in (至少 没有propertyIsEnumerable() 或 hasOwnProperty() 检查),因为它也会迭代 在 Object.prototype 上(虽然 通常不鼓励,可以,如 Array.prototype 的情况,很有用 由用户在没有的地方扩展 引起的命名空间问题 包含其他库 可能不会执行上述检查 这样的迭代以及它们在哪里 意识到这种扩展的影响 将有自己使用 迭代器,例如 for...in)。

    【讨论】:

    • 只能应用于数组?
    • for in 循环可用于任何对象,但不应用于普通数组。
    【解决方案2】:

    for ... in 构造迭代in 右侧对象内的每个元素。在您的情况下,for 语句下方的块对mycars 中的每辆车执行一次。

    【讨论】:

      【解决方案3】:

      首先,您创建一个包含 3 个项目(而不是数组)的 对象

        var mycars = new Object();
        mycars[10] = "Saab";
        mycars[20] = "Volvo";
        mycars[30] = "BMW";
      

      其中102030 是对象属性。
      那么您想要浏览对象,访问所有属性并显示与属性关联的每个值。

      这是 [ for (variable in object) expression ] javascript 构造介入的地方:
      变量 将设置为对象的第一个属性,然后设置为第二个,然后设置为最后一个。试试

        for (v in mycars) alert(v);
      

      看看它是如何工作的,还有这个

        for (v in mycars) alert("Property: "+v+", value: "+mycars[v]);
      

      【讨论】:

      • 您不应该提倡将for..inArray 一起使用。
      【解决方案4】:

      for in是一种掩埋bug的方式,供后人发现。正如已经大量指出的那样,如果应用于数组,它将遍历数组的所有元素,数组的长度,以及碰巧附加到数组的任何其他数据。将其应用于普通对象会更好,但您仍应通过 hasOwnProperty 过滤索引。

      最好使用框架提供的函数,比如 jQuery 的 $.each

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-09
        • 2013-11-22
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 2011-02-13
        • 2015-11-29
        • 1970-01-01
        相关资源
        最近更新 更多