代码之家  ›  专栏  ›  技术社区  ›  Tsuna

javascript-枚举中的点对括号表示法

  •  2
  • Tsuna  · 技术社区  · 8 年前

    我知道点符号和括号符号之间有一些区别,但对于这个特定的问题,我有点困惑,为什么点符号不起作用而括号起作用。

    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 那么它将是未定义的。

    既然“岩矛枪”的属性都是一个词,不应该吗 gun.speargun 还可以调用属性吗?

    我想了一下原因,因为现在 speargun 是一个字符串,如果放入 枪,枪 它实际上变成了这样 gun."speargun" 因为如果使用括号符号,我们只需要 gun[speargun] 而不是使用 gun["speargun"] 因为这会使它成为一个错误的双引号。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Jaime Caffarel Daniel Koverman    8 年前

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

    原因是在JS对象中,所有属性键都是字符串。当您使用点符号时,JS认为您正在寻找一个键,该键的显式键位于点之后。

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

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

    我建议你阅读 this article .

        2
  •  1
  •   Alberto Delgado Roda    8 年前

    是的真的很模糊,有一个经验法则:

    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
  •  1
  •   Nina Scholz    8 年前

    相当于

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

    guns['Sharpshooter'].heft
    

    guns.Sharpshooter.heft
    

    因为方括号中的变量被求值,内容被插入方括号中。你看第二段。

    如果您有一个字符串文本,则可以将其用作 property accessor

    guns.speargun.heft
    

    它不存在,因为你没有财产 speargun 在对象中 guns .