【问题标题】:JavaScript Object Literals: Property names as strings vs. "raw"JavaScript 对象文字:属性名称作为字符串与“原始”
【发布时间】:2011-08-12 17:24:06
【问题描述】:

两者之间是否有区别:

var x = {
  hello: 'world'
};

var x = {
  'hello': 'world'
};

?

也就是说,在什么情况下,将属性名称作为字符串给出与作为“原始”名称给出不同的结果?例如,我知道var x = {}; x['@£$%'] = 'bling!'; 是有效的(因为任何字符串都可以是属性),但x.@£$% = 'bling!' 不起作用。语言关键字或保留关键字也不会作为属性名称(因此 var x = {for: 'good', class: 'y'}; 不起作用。

还有什么?

例如,如果

var hello = 'goodbye'; 

是在上面的例子中定义的吗?或者别的什么,比如

function hello() { 
  return 'goodbye';
}

?

为了安全起见,我是否应该始终将属性名称设为字符串?

【问题讨论】:

标签: javascript


【解决方案1】:

我几乎从不指定 a-zA-Z 以外的任何内容作为我的密钥,所以我并不担心诸如 @ 之类的字符。如果出于某种原因您确实需要这些字符,那么请务必使用引号。

如果您确定关键字是reserved word,或者甚至认为它可能是,只需将其用引号括起来并确保安全.. 否则只需不加引号并节省打字时间。

与您的密钥同名的变量绝对没有任何意义,因为它是按字面意思理解的。

var hello = 'god';
({hello:2})['hello'] // 2

【讨论】:

    【解决方案2】:

    在对象文字中,您可以使用字符串文字(带引号)或标识符(不带引号)。因此,在第一种情况下,您可以使用您喜欢的任何字符,而在第二种情况下,您必须遵循ECMAScript spec 中列出的标识符规则。使用点表示法属性访问器时适用相同的标识符规则。简单总结:

    • 标识符必须以字母开头,_$(两者都可能出现在标识符中的任何位置)
    • 在第一个字符之后,允许更多字符,包括数字
    • 标识符不能是保留字(newvarfunctiondelete 等)

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2011-05-14
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      相关资源
      最近更新 更多