【发布时间】:2011-05-19 21:47:26
【问题描述】:
有什么区别
obj = {'foo': 'bar'}
和
obj = {foo: 'bar'}
我注意到,当我不使用引号时,您不能在键中使用 -。但它真的有区别吗?如果是,是哪个?
【问题讨论】:
标签: javascript
有什么区别
obj = {'foo': 'bar'}
和
obj = {foo: 'bar'}
我注意到,当我不使用引号时,您不能在键中使用 -。但它真的有区别吗?如果是,是哪个?
【问题讨论】:
标签: javascript
不,引号没有区别(除非,正如您所指出的,您想使用不是有效 JavaScript 标识符的键)。
作为旁注,JSON data exchange format 确实需要在标识符周围加上双引号(不允许允许单引号)。
【讨论】:
obj = { 12e34: true }; 与 obj = { '12e34': true }; 不同。前者需要您通过obj['1.2e+35'] 访问该属性,而对于后者,您需要使用obj['12e34']。 See my answer for more details.
这里没有区别。只是风格问题。这样做的原因之一是能够使用 'super' 或 'class' 作为键,因为它们是保留关键字。
有些人可能会想传入带有空格的字符串然后调用 o['I can have whitespace'] 但我认为这是不好的做法。
【讨论】:
不,不是javascript。但是,当键周围的引号不存在时,一些 JSON 解析器会失败。
【讨论】:
来自Unquoted property names / object keys in JavaScript,我写的关于这个主题的文章:
如果属性名称是数字文字或a valid identifier name,则只能省略引号。
[…]
方括号表示法可以安全地用于所有属性名称。
[…]
点表示法仅可以在属性名称是有效的标识符名称时使用。
请注意,ES5 中允许将保留字用作不带引号的属性名称。但是,为了向后兼容 ES3,我还是建议引用它们。
我还制作了一个工具,它会告诉您任何给定的属性名称是否可以不带引号和/或带点表示法使用。试试mothereff.in/js-properties。
【讨论】:
在某些情况下它们是不同的。例如,如果您使用 jQuery,并且在调用 jQuery $() 命令创建元素时制作要传递的参数列表,则引用的单词将转换为参数,而未引用的单词将转换为函数。例如,“size”将设置对象的 size 属性,而 size(不带引号)将调用对象的 size() 函数。见jQuery(),靠近底部:
虽然第二个参数很方便,但它的灵活性可能会导致意想不到的后果(例如 $( "
<input>", {size: "4"} ) 调用 .size() 方法而不是设置 size 属性)。因此,前面的代码块可以写成:
【讨论】: