不带引号的JavaScript对象文字键的规则?

时间:2012-02-20 19:56:16

标签: javascript

在JavaScript中,您可以定义如下对象:

var d = {1: 'test'};

我可以设置一个带负数索引的键,如下所示:

d[-1] = 'test2';

但如果我尝试在文字初始化中使用负数,我会收到错误:

var d = {1: 'test', -1: 'test2'};
Uncaught SyntaxError: Unexpected token -

这是为什么?为什么我不能使用文字负数作为对象的键?是否有一种解决方法允许我将其初始化为文字。我知道我可以使用字符串,但我想使用整数。

6 个答案:

答案 0 :(得分:17)

Unquoted property names / object keys in JavaScript,我对这个主题的写作:

  

如果属性名称是数字文字或a valid identifier name,则只能省略引号。

     

[...]

     

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

     

[...]

     

当属性名称是有效的标识符名称时,点符号只能

-1不是数字文字,它是一元-运算符,后跟数字文字(1)。

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

Screenshot

答案 1 :(得分:4)

有趣的问题。

问题是,输入

之间没有区别
var d = {24: 'foo'};

var d = {"24": 'foo'};

您可以通过执行以下操作进行验证:

var d = {24:'foo', "24":'bar'};

请注意,它只有一个“24”属性(并且在严格模式下失败)。

所以虽然这并不能解释为什么你不能在没有引号的情况下做-1,但希望它确实解释了“-1”同样好。

有趣的是,未加引号的分数似乎工作正常。

编辑:Felix Kling解释了为什么它在另一个答案的评论中不起作用。 -1不是数字文字,它是带有数字文字和一元-运算符的表达式 - 因此它不适合作为对象键。

答案 2 :(得分:3)

因为-1不是有效的变量标识符。

答案 3 :(得分:3)

更改为

var d = { 1: 'test', '-1': 'test2'};

标识符,即关键字或由于其他原因不能成为普通标识符,如果用引号括起来,仍然可以使用。

答案 4 :(得分:1)

我不确定为什么,但你必须引用对象初始值设定项中的负数:

var d = {1: 'test', '-1': 'test2'};

所有对象键在内部都被视为字符串,因此您可以使用以下任一方式处理此键:

d[-1] or d['-1']

答案 5 :(得分:1)

当密钥包含某些字符时,您必须将其放在引号中,如下所示:

var d = {"1": 'test', "-1": 'test2'};

这里有一个非常好的参考,如果没有引号允许哪些字符,它也有一个关于对象属性声明的特定部分:http://asenbozhilov.com/articles/identifiers-en.html#identifier_start