之间是否存在差异:
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';
}
我是否应该始终将我的属性命名为字符串,以保证安全?
答案 0 :(得分:4)
我几乎从未指定a-zA-Z
以外的任何内容作为我的密钥,因此我并不担心@
等字符。如果出于某种原因你真的需要这些字符,那么一定要继续并使用引号。
如果您确定关键字是reserved word,或者甚至远程认为它是关键字,只需将其包装在引号中并保证安全..否则只需要无报价并节省输入时间
与您的密钥同名的变量绝对没有影响,因为它是字面意思。
var hello = 'god';
({hello:2})['hello'] // 2
答案 1 :(得分:3)
在对象文字中,您可以使用字符串文字(带引号)或标识符(不带引号)。在第一种情况下,您可以使用您喜欢的任何字符,而在第二种情况下,您必须遵循ECMAScript spec中列出的标识符规则。使用点表示法属性访问器时,应用相同的标识符规则。简化摘要:
_
或$
开头(两者都可能出现在标识符中的任何位置)new
,var
,function
,delete
等)