未引用的 JavaScript 对象文字键的规则?

IT技术 javascript
2021-02-24 21:03:39

在 JavaScript 中,您可以像这样定义一个对象:

var d = {1: 'test'};

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

d[-1] = 'test2';

但是如果我尝试在文字初始化中使用负数,则会出现错误:

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

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

6个回答

来自JavaScript 中的 Unquoted property names / object keys,我关于这个主题的文章:

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

[…]

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

[…]

点符号只能在属性名称是有效标识符名称时使用。

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

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

截屏

@Pacerier 只要您使用有效的字符串,在语言级别就没有这样的限制,没有。
2021-04-20 21:03:39
@MathiasBynens,如果引用密钥,是否有任何限制?
2021-04-22 21:03:39
@StuartCook 感谢您的报告!已修复mothereff.in/js-properties#-1(您可能需要刷新以更新应用缓存。)
2021-04-25 21:03:39
你的工具,声称-1+1可以作为不带引号的属性名称,即使他们实际上并不工作。
2021-05-07 21:03:39
我想你的意思是“一元运算-符”。
2021-05-09 21:03:39

有趣的问题。

问题是,打字没有区别

var d = {24: 'foo'};

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

您可以通过执行以下操作来验证这一点:

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

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

因此,虽然这并不能解释为什么您不能在没有引号的情况下执行 -1,但希望它确实可以解释“-1”同样好。

有趣的是,不带引号的小数似乎工作正常。

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

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

但是我以后仍然可以通过键分配它,所以这是键必须是有效变量名的文字语法的限制吗?
2021-04-17 21:03:39
正确的。它只是 hte 对象的表示。
2021-04-21 21:03:39
@FelixKling 啊哈,你是对的,当然,它是一个带有一元运算符的数字文字!
2021-05-02 21:03:39
@jterrace、@Daniel:对象初始值设定项中的属性名称也可以是字符串文字和数字文字(不仅是标识符名称)。但显然,-1不是数字文字:es5.github.com/#x7.8.3
2021-05-14 21:03:39

改成

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

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

1 也不能用作标识符......只是说;)
2021-04-23 21:03:39

我不确定确切原因,但您必须在对象初始值设定项中引用负数:

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

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

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