有什么区别吗

obj = {'foo': 'bar'} 

and

obj = {foo: 'bar'}

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


当前回答

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

其他回答

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

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

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

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

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

顺便说一句,JSON数据交换格式确实要求标识符周围有双引号(不允许单引号)。

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

只有当属性名是数字字面值或有效标识符名称时,才能省略引号。 […] 括号符号可以安全地用于所有属性名。 […] 点表示法只能在属性名是有效标识符名时使用。

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

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

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