【问题标题】:Wrong approach to dot notation?点符号的错误方法?
【发布时间】:2015-02-21 09:39:01
【问题描述】:

我有一个看起来像这样的对象:

var obj = {
   Laser: [0, 2],
   Missile: [4, 4]
}

使用文字符号,我可以很好地访问属性:

for (prop in obj){
console.log(prop + " scored " + obj[prop][0] + " out of " + obj[prop][1] + " shots.");

为什么不能像这样使用点表示法来表达相同的意思?

for (prop in obj){
console.log(prop + " scored " + obj.prop[0] + " out of " + obj.prop[1] + " shots.");
-> error

提前致谢

【问题讨论】:

  • 因为obj没有名为prop的键,所以它的键是:Laser, Missile。在 JS 中,您可以这样做,obj.Laserobj['Laser']var keyname='Laser'; obj[keyname]
  • JavaScript dot notation 的可能重复项
  • obj.prop 等价于obj['prop']

标签: javascript notation


【解决方案1】:

使用点表示法时,本例中的 prop 会在对象上查找名为 prop 的实际键,而它没有。看看这篇文章,了解点和括号符号https://stackoverflow.com/a/20736772/3421811之间更深入的区别@

【讨论】:

    【解决方案2】:

    我强烈推荐你awesome reading

    这是访问属性一章的引述:

    符号的工作方式几乎相同,唯一的区别是方括号符号允许动态设置属性和使用会导致语法错误的属性名称。

    使用此来源的示例:

    var foo = {name: 'kitten'}
    foo.name; // kitten
    foo['name']; // kitten
    
    var get = 'name';
    foo[get]; // kitten
    
    foo.1234; // SyntaxError
    foo['1234']; // works
    

    【讨论】:

      【解决方案3】:

      我认为将变量替换为常量以查看每个循环中实际发生的情况是最简单的:

      第一个循环:

      for (prop in obj){
          console.log(prop + " scored " + obj[prop][0] + " out of " + obj[prop][1] + " shots.");
      }
      

      迭代 1:

      console.log("Laser" + " scored " + obj["Laser"][0] + " out of " + obj["Laser"][1] + " shots.");
      

      迭代 2:

      console.log("Missile" + " scored " + obj["Missile"][0] + " out of " + obj["Missile"][1] + " shots.");
      

      第二个循环:

          for (prop in obj){
      console.log(prop + " scored " + obj.prop[0] + " out of " + obj.prop[1] + " shots.");
      -> error
      

      迭代 1:

      console.log("Laser" + " scored " + obj["prop"][0] + " out of " + obj["prop"][1] + " shots.");
      

      迭代 2:

      console.log("Missile" + " scored " + obj["prop"][0] + " out of " + obj["prop"][1] + " shots.");
      

      通过使用点表示法,您要求在obj 上查找名为prop 的属性。这显然不是你想要的。

      所以这些是等价的:

      1. obj.prop
      2. obj["prop"]

      【讨论】:

        【解决方案4】:

        因为这两个例子不一样。第一个还可以:

        prop == "Laser"
        obj[prop] == obj["Laser"]
        obj["Laser"][0] === 0
        
        prop == "Missile"
        obj[prop] == obj["Missile"]
        obj["Missile"][0] == 4
        

        在第二个中,您尝试访问未定义的 "prop" 属性:

        obj.prop == obj["prop"]
        obj["prop"] === undefined
        obj["prop"][0] // TypeError: Cannot read property "0" of undefined
        

        而且,顺便说一句,这与 JSON 无关。

        【讨论】:

          【解决方案5】:

          简单地说,prop 是属性名的字符串形式。 obj.propfor ... in 中与 obj.'Missile' 相同。

          括号方法使用一个字符串并将该字符串与对象属性的名称进行比较。如果您不在括号内使用字符串,它将查找名为 Missile 的变量并返回引用错误,因为没有。

          var obj = {
            Laser: [0, 2],
            Missile: [4, 4]
          }
          
          function log(input) {
            setTimeout(function() {
              console.log(input);
            }, 1000);
          }
          
          log(obj['Missile']); // [4, 4]
          log(obj.Missile); // [4, 4]
          log(obj[Missile]); // Looks for a variable called Missile. Doesn't find it. ReferenceError: Missile is not defined
          // log(obj.'Missile'); // Invalid string placement. SyntaxError: Unexpected string

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-25
            • 2016-07-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多