【问题标题】:javascript - dot vs bracket notation in enumerationjavascript - 枚举中的点与括号表示法
【发布时间】:2017-02-24 23:58:50
【问题描述】:

我确实知道点符号和括号符号之间存在一些差异,但对于这个特定问题,我有点困惑为什么点符号不起作用而括号起作用。

var rockSpearguns = {
  Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"},
  Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"},
  Javelinjet: {barbs: 4, weight: 12, heft: "waist"},
  Firefork: {barbs: 6, weight: 8, heft: "overhand"}
};

function listGuns (guns) {
    for(var speargun in guns){
        console.log("Behold! "+speargun+", with "+ guns[speargun].heft +" heft!");
    }
}

我有点困惑的部分是 guns[speargun].heft 这会正常工作,但如果我这样做 guns.speargun.heft 那么它将是未定义的。

既然rockSpearguns中的属性都是一个词,gun.speargun不应该也能调出属性吗?

我认为这是原因,因为现在speargun 是一个字符串,如果放入gun.speargun,它实际上会变成gun."speargun",因为如果使用括号表示法,我们只需使用gun[speargun] 而不是使用@987654330 @ 因为这只会使它成为一个错误的双引号。

【问题讨论】:

标签: javascript object properties notation


【解决方案1】:

它不起作用,因为 rockSpearguns 对象中没有 speargun 属性。

原因是在一个 JS 对象中,所有的属性键都是字符串。当您使用点表示法时,JS 认为您正在寻找一个带有点后任何内容的显式键的键。

在您的代码中,var speargun 被替换为 rockSpearguns 对象内每个属性的字符串值。

所以,guns[speargun].heft 转换为 guns["Sharpshooter"].heft

我建议你阅读this article

【讨论】:

    【解决方案2】:

    是的,确实是模棱两可,有一个经验法则:

    1. 当要访问的属性值是动态生成时使用括号,例如:

      var Person = {
          name: 'John',
          lastName: 'Doe'
      };
      
      var propertyToCheck = 'name';
      
      console.log(Person.propertyToCheck); //error!
      console.log(Person[propertyToCheck]); //correct way
      
    2. 当要访问的属性值不是动态生成时使用点(你事先知道该属性),例如:

       var Person = {
           name: 'John',
           lastName: 'Doe'
       };
      
      console.log(Person.name);
      

    顺便说一句,你可以在这两种情况下使用括号,但我更喜欢选择我刚才提到的,因为使用括号似乎你正在处理数组而不是对象

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      相当于

      speargun = 'Sharpshooter';
      guns[speargun].heft
      

      guns['Sharpshooter'].heft
      

      guns.Sharpshooter.heft
      

      因为方括号中的变量被求值并且内容被插入到括号中。你得到第二段。

      如果你有一个字符串文字,那么你可以将它用作property accessor 用于带有点的对象。

      在上述情况下,您使用

      guns.speargun.heft
      

      不存在,因为您在对象guns 中没有属性speargun

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        相关资源
        最近更新 更多