【问题标题】:javascript for...in loops please explainjavascript for...in 循环请解释
【发布时间】:2013-08-31 23:30:00
【问题描述】:

我在这里的第一个问题需要帮助理解 JavaScript 中的 for in 循环。

当我运行以下代码时,我从警报函数中得到“未定义”:

var o = {
  a: "property 1", 
  b: "property 2", 
  c: "property 3", 
  d: "property 4"
}

for (p in o) {
  alert(o.p); 
}

但如果我将. 更改为[ ](即alert(o[p])),警报将按预期返回属性值。

为什么我不能使用. 访问对象属性?

【问题讨论】:

  • 因为它无法知道您要使用变量p 而不是名为p 的属性。因此,. 运算符专门用于属性标识符的名称(它们是否存在),而[] 用于使用任何表达式的结果作为属性名称。

标签: javascript loops for-in-loop


【解决方案1】:

想象一下你有这个对象:

var o = {
  a: "property 1", 
  b: "property 2", 
  c: "property 3", 
  d: "property 4",
  p: "property 5"
}

并运行以下命令:

for (p in o) {
  console.log(o.p);
}

结果将是:

property 5
property 5
property 5
property 5
property 5

因为o.p的意思是要获取一个名为p的属性的值。

与您的示例类似,属性p 未在您的对象中定义。

如果要通过字符串获取属性的值,则必须使用[] 表示法。

【讨论】:

    【解决方案2】:

    o.p 表示o 的属性“p”。

    o["p"] 意思相同。

    o[x] 表示o 的某个属性(其值由变量x 定义)。

    o[p] 一样。

    【讨论】:

      【解决方案3】:
      o[p]
      

      是数组 o 中的第 p 个元素。

      o.p
      

      是数组o的属性p,正确报告为未定义,因为它不存在。

      【讨论】:

        【解决方案4】:

        如果你仔细看看这个 for in 循环:

        var obj = {
          a: "property 1", 
          b: "property 2", 
          c: "property 3", 
          d: "property 4"
        }
        for (var prop in obj) {
            if (typeof(prop) == 'string') {
                console.log('This is a string!');
            }
        }
        

        您会注意到 for in 循环给您的是属性的名称。 这就是为什么可以使用obj[prop] 的原因,因为该属性将是一个字符串,这是访问对象属性的合法方式。

        当您尝试执行 obj.prop 时,它会给您 undefined,因为 property 是一个表示属性名称的字符串,它不是实际的属性。

        【讨论】:

        • 太棒了,我现在明白了,prop 是一个字符串,因此就像说 obj."prop" 是不合法的。 obj["prop"] 是合法的。
        猜你喜欢
        • 2016-03-30
        • 2016-08-20
        • 1970-01-01
        • 2011-07-12
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 2015-02-25
        相关资源
        最近更新 更多