Правила для некотируемых символов объекта Object Literal?

В JavaScript вы можете определить такой объект:

var d = {1: 'test'};

и я могу установить ключ с индексом отрицательного числа следующим образом:

d[-1] = 'test2';

но если я попытаюсь использовать отрицательное число в литеральной инициализации, я получаю сообщение об ошибке:

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

Почему это? Почему я не могу использовать буквальное отрицательное число в качестве ключа к объекту? Есть ли способ обхода, который позволяет мне инициализировать его как литерал. Я знаю, что я мог бы использовать строки вместо этого, но я хочу использовать целые числа.

Ответ 1

Из Некотируемые имена свойств/объектные ключи в JavaScript, моя запись по теме:

Цитаты могут быть опущены только в том случае, если имя свойства является числовым литералом или допустимым именем идентификатора.

[...]

Обозначение скобок можно безопасно использовать для всех имен свойств.

[...]

Точечная нотация может использоваться только тогда, когда имя свойства является допустимым именем идентификатора.

-1 не является числовым литералом, его унарным -, за которым следует числовой литерал (1).

Я также создал инструмент, который расскажет вам, можно ли использовать любое имя свойства без кавычек и/или с точечной нотацией. Попробуйте в mothereff.in/js-properties.

Screenshot

Ответ 2

Интересный вопрос.

Дело в том, что нет никакой разницы между вводом

var d = {24: 'foo'};

и

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

Вы можете проверить это, выполнив:

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

Обратите внимание, что он имеет только одно свойство "24" (и не работает в строгом режиме).

Итак, хотя это не объясняет, почему вы не можете делать -1 без кавычек, надеюсь, это объясняет, что "-1" так же хорошо.

Интересно, что некорректные дробные числа работают нормально.

Изменить: Феликс Клинг объясняет, почему он не работает в комментарии к другому ответу. -1 не является числовым литералом, это выражение с числовым литералом и унарным оператором -, поэтому оно не подходит в качестве ключа объекта.

Ответ 3

Потому что -1 не является допустимым идентификатором переменной.

Ответ 4

Изменить на

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

Идентификаторы, которые являются ключевыми словами или не могут быть обычным идентификатором по другим причинам, все еще могут использоваться, если они окружены кавычками.

Ответ 5

Я точно не знаю, почему, но вы должны указать отрицательное число в инициализаторе объекта:

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

Все ключи объекта обрабатываются как строки внутри, поэтому вы можете обращаться к этому ключу, используя:

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

Ответ 6

Если ключ содержит определенные символы, вы должны поместить его в кавычки следующим образом:

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

Здесь довольно хорошая ссылка на то, какие символы разрешены без цитирования, и в ней также есть специальный раздел об объявлении свойства объекта: http://asenbozhilov.com/articles/identifiers-en.html#identifier_start.