在JavaScript中,您可以定义如下对象:
var d = {1: 'test'};
我可以设置一个带负数索引的键,如下所示:
d[-1] = 'test2';
但如果我尝试在文字初始化中使用负数,我会收到错误:
var d = {1: 'test', -1: 'test2'};
Uncaught SyntaxError: Unexpected token -
这是为什么?为什么我不能使用文字负数作为对象的键?是否有一种解决方法允许我将其初始化为文字。我知道我可以使用字符串,但我想使用整数。
答案 0 :(得分:17)
从Unquoted property names / object keys in JavaScript,我对这个主题的写作:
如果属性名称是数字文字或a valid identifier name,则只能省略引号。
[...]
括号表示法可以安全地用于所有属性名称。
[...]
当属性名称是有效的标识符名称时,点符号只能 。
-1
不是数字文字,它是一元-
运算符,后跟数字文字(1
)。
我还制作了一个工具,告诉您是否可以使用任何给定的属性名称而不带引号和/或带点符号。在mothereff.in/js-properties处尝试。
答案 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。