带引号和不带引号的对象键之间有什么区别?


209

之间有什么区别

obj = {'foo': 'bar'} 

obj = {foo: 'bar'}

我注意到-当我不使用引号时,您不能在密钥中使用。但这实际上有区别吗?如果是的话,哪个?

Answers:


136

不,引号不会有任何区别(除非如您所述,除非您想使用不是有效的JavaScript标识符的键)。

作为一个侧面说明,JSON数据交换格式 确实需要标识周围的双引号(和它不会让单引号)。


88
实际上,如果您使用数字文字作为属性名称,则引号有所不同。例如,obj = { 12e34: true };与并不相同obj = { '12e34': true };。前者要求您通过访问obj['1.2e+35'],而后者则需要使用obj['12e34']请参阅我的答案以获取更多详细信息。
Mathias Bynens'3

1
的确如此,但是如果给定第一个字符+字母数字的双引号是可选的,那将是一个绝妙的选择,并且可能有很多空白爱好者又称为不可见空格或制表符吗?非常适合未深度嵌套的数据。
杰森·塞布林

124

非上市属性名称/在JavaScript对象键,我写了关于这个问题的:

如果属性名称是数字文字或有效的标识符名称,则只能省略引号

[…]

括号符号可以安全地用于所有属性名称。

[…]

点符号只能在属性名称是有效的标识符名称时使用。

请注意,在ES5中允许将保留字用作未引用的属性名称。但是,为了向后兼容ES3,我建议无论如何都要引用它们。

我还制作了一个工具,该工具将告诉您是否可以使用任何给定的属性名称而无需使用引号和/或点号。在mothereff.in/js-properties中尝试一下。

屏幕截图


该工具可以挽救生命。感谢您发布此信息。
克里斯·克里斯滕森

我正从悬崖上走下来,正要掉下一个非常陡峭的斜坡,朝着某种完全血腥的死亡猛扑。但是可惜,我单击了您答案中的链接,其中包含一个非常简单的JS工具,可防止我从悬崖上掉下来。该工具可以挽救生命。
安德鲁

8

这里没有区别。只是样式问题。这样做的原因之一是能够使用“ super”或“ class”作为键,因为这些是保留关键字。

某些人可能很想在字符串中输入空格,然后调用o ['我可以拥有空格'],但我会称其为不好的做法。



1

在某些情况下它们是不同的。例如,如果您使用的是jQuery,并且在调用jQuery $()命令创建元素时要传递的参数列表,则将带引号的单词转换为参数,将非带引号的单词转换为函数。例如,“ size”将设置对象的size属性,而size(不带引号)将在对象上调用size()函数。看到底部的jQuery()

尽管第二个参数很方便,但它的灵活性可能会导致意外的结果(例如$(“ <input>”,{size:“ 4”})调用.size()方法而不是设置size属性)。因此,可以将先前的代码块编写为:


我不认为该示例能说明您的想法。您引用的问题是因为jQuery有一个称为size的方法,并且通过选择方法可以解决方法大小和属性大小之间的冲突。在jQuery中,有些情况下将Value作为字符串或其他类型传递会导致行为发生变化,但绝不会通过在引号中而不是引号中定义具有有效属性名称的属性。
Alex Weitzer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.