【问题标题】:What is the difference between 'for...in' and 'for each...in' in javascript? [duplicate]javascript中的'for...in'和'for each...in'有什么区别? [复制]
【发布时间】:2010-12-28 17:34:06
【问题描述】:

我知道在 C# 中你像这样使用 foreach:foreach string str in array1 {console.writeline(str);} “for each ... in”在 JavaScript 中也像这样使用吗?

【问题讨论】:

    标签: javascript foreach for-loop


    【解决方案1】:

    Afaik 只有 Firefox 支持 for each...in。它不是任何标准的一部分,大多数工具(如JSLint)在遇到它时都会抛出错误。

    不同之处在于for...in 循环遍历对象的,而for each...in 循环遍历

    所以推荐的方法是不使用 for each 而做

    for (var key in obj) {
        console.log(obj[key]);
    }
    

    改为。

    更新:我不能说它与 C# 有什么关系。但关于数组:永远不要使用for...in 遍历数组(yellow box here):

    尽管将其用作迭代数组的方法可能很诱人,但这是一个坏主意。 for...in 语句除了遍历数组元素之外还遍历用户定义的属性,因此如果您修改数组的非整数或非正数属性(例如,通过向其添加“foo”属性,甚至添加方法或属性到Array.prototype),for...in 语句将返回除数字索引之外的用户定义属性的名称。

    改用普通的for 循环:

    for(var i = 0, l = arr.length; i<l; i++)
    

    或者更花哨的:

    for(var i = arr.length; i--;)
    

    【讨论】:

      【解决方案2】:

      标准 JavaScript 中没有for each in。如果他们想扩展语言,它可能存在于特定的实现中。

      JavaScript 中的for..in 仅通过关联与数组相关,因为它与对象相关,而数组就是对象。 for..in 确实 not 循环遍历数组条目,就像 for each 在 C# 中所做的那样。它也不会循环遍历数组索引,尽管人们倾向于认为它会这样做。 (它遍历属性名称;数组索引是属性名称,但数组对象也可以有其他属性。)它更像是带有字典键的for each。我已经相当彻底地讨论了这个in this article

      【讨论】:

        【解决方案3】:

        “for each ... in”返回值而不是键...见这里:

        http://www.dustindiaz.com/for-each-in/

        【讨论】:

          【解决方案4】:

          in 运算符用于枚举 javascript object 的属性(名称,而不是值) - 在 javascript 中,所有非基元都是对象(继承自 Object)。

          你是这样用的

          var obj = {
              a: "aaa",
              b: "bbb"
          };
          
          for (var key in obj) {
              if (obj.hasOwnProperty(key)){
                  console.log("obj has a property " + key + ", with a value of " + obj[key]);
              }
          }
          

          由于in还枚举了通过原型链继承的属性,我们必须使用hasOwnProperty来检查这些是否确实是对象自己的属性,而不仅仅是继承的属性。

          注意,in 运算符永远不能用于枚举存储在数组中的项目 - 为此,您应该使用带有索引的常规 for/while 循环。

          【讨论】:

            猜你喜欢
            • 2010-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-30
            相关资源
            最近更新 更多