Правила для некотируемых символов объекта 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.