【问题标题】:Why does this for loop log "undefined"? [duplicate]为什么这个 for 循环日志“未定义”? [复制]
【发布时间】:2015-12-16 05:09:01
【问题描述】:

所以我有这个 javascript 对象,我想循环并打印出它的每个属性值。

代码如下:

var names = {
            "firstName":"Billy",
            "lastName":"John",
            "age":30
        };

for(var a in names){
    console.log(names.a);
}

它 console.logs "undefined" 3 次。

但如果我这样做:

for(var a in names){
    console.log(names[a]);
}

它打印出比利,约翰,30 岁。

如果我在循环之外 console.log names.firstName 它可以工作。并且考虑到在第一个循环执行期间afirstName,它应该可以工作。

为什么会这样?谢谢。

【问题讨论】:

  • 因为属性名称的工作方式。

标签: javascript javascript-objects for-in-loop


【解决方案1】:

因为使用点表示法 (names.a) 您正在访问对象上的属性 a,所以该属性是未定义的。

当您使用括号表示法names[a] 时,将评估变量并且语句将如下所示:names['firstName'], names['lastName'], ...

通常您在访问属性时总是使用点表示法,但在您的情况下 - 因为您需要使用变量持有的名称访问属性 - 您将需要使用括号表示法。

另一种使用方括号表示法的情况是,当您需要访问一个名称无法使用点表示法编写的属性时。考虑一下:

var a = { "my-special property": 1 };
// Try to access it via dot notation:'
console.log(a.my-special property); // SyntaxError
// But with bracket notation:
console.log(a['my-special property']); // 1

【讨论】:

    【解决方案2】:

    names[a]names.a 不等价。

    a 是一个引用字符串的变量。

    names.a 期望在您的名称对象中有一个名为 a 的键。

    names[a] 等同于 names.firstNamename.lastNamenames.age

    【讨论】:

      【解决方案3】:

      因为names 没有.a 属性。 a 指的是一个变量,其值为属性。

      【讨论】:

        【解决方案4】:

        如果你写了:

        var names = {
                    "a":"property a",
                    "firstName":"Billy",
                    "lastName":"John",
                    "age":30
                };
        

        然后循环:

        for(var a in names){
            console.log(names.a);
        }
        

        会登录property a 3 次,明白吗?

        【讨论】:

          猜你喜欢
          • 2019-01-09
          • 2016-03-16
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          相关资源
          最近更新 更多