JavaScript对象文字:属性名称为字符串与“原始”

时间:2011-04-26 02:47:35

标签: javascript

之间是否存在差异:

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';
}

我是否应该始终将我的属性命名为字符串,以保证安全?

2 个答案:

答案 0 :(得分:4)

我几乎从未指定a-zA-Z以外的任何内容作为我的密钥,因此我并不担心@等字符。如果出于某种原因你真的需要这些字符,那么一定要继续并使用引号。

如果您确定关键字是reserved word,或者甚至远程认为它是关键字,只需将其包装在引号中并保证安全..否则只需要无报价并节省输入时间

与您的密钥同名的变量绝对没有影响,因为它是字面意思。

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

答案 1 :(得分:3)

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

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