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

meo*_*meo 201 javascript

两者之间有什么区别吗?

obj = {'foo': 'bar'} 
Run Code Online (Sandbox Code Playgroud)

obj = {foo: 'bar'}
Run Code Online (Sandbox Code Playgroud)

我注意到-当我不使用引号时你不能在密钥中使用.但它真的有所作为吗?如果是的话,哪个?

bdu*_*kes 132

不,引号没有区别(除非,如您所说,您希望使用不是有效JavaScript标识符的密钥).

另外,JSON数据交换格式 确实需要围绕标识符使用双引号.

  • 实际上,如果您使用数字文字作为属性名称,引号_can_会有所不同.例如,`obj = {12e34:true};`与`obj = {'12e34':true};`不同.前者要求你通过`obj ['1.2e + 35']`访问属性,而对于后者你要使用`obj ['12e34']`.[详情请参阅我的回答.](http://stackoverflow.com/a/9568622/96656) (83认同)
  • @MathiasBynens 说它可以对数字文字产生影响,但我想说考虑这个的最好方法是您定义/访问的属性始终转换为字符串。因此,这不仅涉及数字文字,还涉及任何不是字符串的属性,当转换为字符串时,会产生不同的“文本值”。例如 `obj[{}]` 将尝试访问属性 `'[object Object]'` 而不是属性 `'{}'` 因为 `({}).toString()` 是 `'[object Object] '` 而不仅仅是带引号的 `{}`。 (3认同)

Mat*_*ens 123

JavaScript中的Unquoted属性名称/对象键,我对该主题的描述:

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

[...]

括号表示法可以安全地用于所有属性名称.

[...]

只有当属性名称是有效的标识符名称时,才能使用点表示法.

请注意,保留字可以在ES5中用作不带引号的属性名称.但是,为了向后兼容ES3,无论如何我建议引用它们.

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

截图


Ray*_*nos 8

这里没有区别.只是风格问题.这样做的原因之一是能够使用"超级"或"类"作为关键,因为这些是保留关键字.

有些人可能会想要用空格传入一个字符串,然后调用o ['我可以有空格']但我会称之为糟糕的做法.