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

有什么区别吗

obj = {'foo': 'bar'}

而且

obj = {foo: 'bar'}

我注意到,当我不使用引号时,你不能在键中使用-。但这真的有区别吗?如果是,是哪个?

73676 次浏览

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

作为旁注,JSON数据交换格式 需要双引号括住标识符(并且允许单引号)。

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

有些人可能会试图传入一个带有空格的字符串,然后调用o['I can have whitespace'],但我认为这是一种糟糕的做法。

不,不是javascript。但是,当键周围的引号不存在时,一些JSON解析器将失败。

来自 JavaScript中不带引号的属性名/对象键,我关于这个主题的文章:

只有当属性名是数字字面值或有效的标识符名称时,才能省略引号。

[…]

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

[…]

当属性名是有效的标识符名时,点表示法可以使用只有

注意,在ES5中保留字被允许用作不带引号的属性名。然而,为了与ES3向后兼容,我还是建议引用它们。

我还制作了一个工具,可以告诉您任何给定的属性名是否可以不带引号和/或带点符号使用。在mothereff.in / js-properties试试。

< a href = " http://mothereff。in/js-properties#12e34" rel="noreferrer">截图 .

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

虽然第二个参数很方便,但它的灵活性可能会导致意想不到的结果(例如,$("<input>", {size: "4"})调用.size()方法而不是设置size属性)。因此,前面的代码块可以写成: