【问题标题】:How to use variables in dot notation like square bracket notation如何在点表示法中使用变量,如方括号表示法
【发布时间】:2011-08-18 05:17:00
【问题描述】:

我一直在 Javascript 中使用方括号表示法来创建和调用关联数组。

在这个例子中,我知道方括号表示法允许您使用变量来调用数组中的某个对象。

你会如何用点表示法做这样的事情?

var item = {};
    item['1'] = 'pen';

var x = 1;

console.log(item[x]);  // console will show 'pen'

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您不能在点表示法中使用变量(没有使用eval,您不想想要这样做)。使用点表示法,属性名称本质上是一个常量。

    myObj.propName
    // is equivalent to
    myObj["propName"]
    

    【讨论】:

    • -1 因为它是错误的。看我的回答。第一行中的propName 被视为属性,而不是变量!
    • @sjngm 我不同意。 @nnnnnn 并不是暗示propName 是一个变量,而是一个属性的名称。
    • @zack 好吧,换个名字会更好。它说“相当于”意味着第一行与第三行做同样的事情。这不是真的。
    • @zack 也许我错了,但我第一次读到这个答案时它说myObj[propName]。不?除此之外,我同意,它是一样的。现在。
    • @Paul Sham 在这种情况下,您可能想改用jshint.com。我已经与 JSLint 搏斗了一段时间,有时我只是完全不同意它的胡言乱语。我是 Crockford 的忠实粉丝,但 JSLint 非常严格。
    【解决方案2】:

    简短的回答是:您不能使用 dot notation 访问属性,除非您知道属性的名称。

    点表示法还限制了您可以访问的属性名称,因为属性名称必须是有效的 JavaScript 标识符。例如,如果您有一个名为 my prop(或者更好的是 my%prop)的属性,那么不使用 bracket notation 就无法访问它,因为在大多数情况下会导致语法错误。

    Member Operators page on MDN 进一步解释了这一点。

    顺便说一句:

    能够使用点表示法动态查找属性会不会有点令人困惑?

    item.x // is this the property "x" or do I have to look up variable "x"?
    

    【讨论】:

    • 感谢您提供的参考链接。是的,现在我想起来,这会令人困惑。我只是不知道有没有办法。
    【解决方案3】:

    如果您使用数字访问数组,您必须使用方括号:

    item[0]
    
    var k = 0;
    item[k]
    

    作为

    item.0
    

    不起作用(语法错误)。

    如果你使用字符串

    item["key"]
    
    var p = "key";
    item[p]
    

    等于

    item.key
    

    在后一种情况下

    var p = "key";
    item.p
    

    会导致错误的输出,因为p 在此处不被视为变量。

    【讨论】:

    • 谢谢,我不是专门询问数字,只是想不出更好的标识符。但是,这是了解数字的好信息。
    【解决方案4】:

    点表示法仅限于某些字符...参见this question ...方括号表示法允许您打破这种限制:

    var item = {};
    item['very long variable name containing empty spaces ... and dots...'] = 'valid var';
    item.1 = 'not valid var'; // will not work;
    item['1'] = 'valid var'; // will do just fine...
    

    【讨论】:

      【解决方案5】:

      你现在真的可以了。

      在这种情况下,您可以使用方括号将变量用于点表示法。

      console.log(item.[x])
      

      这对于在 Typescript 中使用特别有用。

      【讨论】:

        【解决方案6】:

        我做了一个函数来通过点表示法设置变量,在角度 2 中,但这也可以在 vanilla javascript 中使用,只需稍作修改。

        class Utility {
            static setByDot(_obj, _path, _val) {
                return _path.split('.').reduce(function (prev, curr, _idx, _arr) {
                    if ( _idx == (_arr.length-1) && prev ) {
                        prev[curr] = _val;
                    }
        
                    return prev ? prev[curr] : null
                }, _obj || self);
            }
        }
        

        所以你可以打电话

        Utility.setByDot( _obj, 'foo.bar', 'value' );
        

        然后

        console.log( _obj.foo.bar );
        

        输出,如果路径存在

        string(6) 'value' 
        

        如果路径不存在,它只是优雅地退出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-10
          • 1970-01-01
          相关资源
          最近更新 更多