Массив JavaScript с отрицательными ключами int

17

Кажется, я не могу определить что-то вроде:

var a = {-1: 'Apple', -2: 'Orange'}

мой Safari жалуется на syntax error near '-' . Parens не помогает, т. Е.% Co_de% - в этом случае Safari не нравится начальный паз.

Если я хочу, чтобы ключи были просто ints, а не строками, каков правильный способ построения массива-помощника, если таковые имеются?

    
задан mojuba 18.11.2011 в 13:09
источник
  • Есть ли веская причина не использовать строки? То есть: var a = {"-1": "Apple"} ;. –  Ionuț G. Stan 18.11.2011 в 13:12
  • Вы понимаете, что все ключи - это строки? var a = {1: 2} преобразует только 1 в "1" –  Raynos 18.11.2011 в 13:15
  • @ Райнос, спасибо, не знал этого, и это все объясняет. –  mojuba 18.11.2011 в 13:20
  • @Raynos, если вы опубликуете ответ, я соглашусь с ним. –  mojuba 18.11.2011 в 13:22
  • @mojuba отметьте ответ Зака ​​правильным –  Raynos 18.11.2011 в 13:23

4 ответа

21

См. раздел 11.1.5 Спецификация языка ECMAScript : там вы увидите, что PropertyName действительно может быть NumericLiteral , но в разделе 7.8.3 спецификации указано, что NumericLiteral может не начинаться со знака минус , Похоже, что отрицательные «литералы» в вашем примере представляют собой выражения, состоящие из унарного оператора, и NumericLiterals .

Однако PropertyName может не быть выражением: это может быть только имя идентификатора, числовой литерал или строковый литерал, который предполагает, что вы можете написать

{'-1': 'Apple', '-2': 'Orange'}

Благодаря GetFree для поиска правильного объяснения!

    
ответ дан Adam Zalcman 18.11.2011 в 13:19
источник
  • Это не причина. Часть, которую вы цитируете, объясняет, что числовые литералы в любом случае внутренне преобразуются в строки, поэтому нет никакой разницы между ними при использовании в качестве ключей. Фактическая причина, по которой вы не можете использовать отрицательные числа, состоит в том, что отрицательное число является выражением (знак минуса, за которым следует числовой литерал), и вы не можете использовать выражения в качестве ключей в объектном литерале. –  GetFree 08.09.2013 в 17:08
  • Вы правы. Из раздела 7.8.3 следует, что числовые литералы могут начинаться не с минуса, а в разделе 11.1.5 подразумевается, что выражения не могут быть именами свойств. Это действительно правильное объяснение. Благодаря! –  Adam Zalcman 08.09.2013 в 18:21
18

Просто оберните их в кавычки. Вы можете получить доступ к номерам:

var a = {"-1": 'Apple', "-2": 'Orange'}
a[-1]; // Apple;
    
ответ дан Dennis 18.11.2011 в 13:12
источник
  • Это очевидно, я сказал в вопросе, что мне нужно, чтобы они были ints, а не строки. Правильный ответ заключается в том, что внутренние ключи всегда являются строками, поэтому нет причин не указывать их. –  mojuba 18.11.2011 в 13:21
  • Что именно означает «Мне нужно, чтобы они были ints»? Вы не можете указать отрицательные числа, потому что ключ должен быть буквальным значением и - является унарным отрицательным оператором, что делает его выражением. –  Dennis 18.11.2011 в 13:29
  • В JavaScript, когда вы ожидаете, что что-то будет числом, а не строкой, могут иметь последствия, например. i + 1 дает разные результаты в зависимости от типа i. Но на этот вопрос уже ответили: в JavaScript ключи всегда преобразуются в строки. –  mojuba 18.11.2011 в 13:43
  • Оператор + перегружен, но ["1"] совпадает с [1]. Я не уверен, какое поведение вы ожидали. –  Dennis 18.11.2011 в 14:47
  • Рассмотрим для (var i in a) {if (a [i + 1]) .... Хорошо знать, что i всегда является строкой независимо от того, как вы создали свой массив. –  mojuba 18.11.2011 в 15:48
3

Цитата работает для меня:

var a = {'-1': 'Apple', '-2': 'Orange'};
console.log(a[-1]);
    
ответ дан aurora 18.11.2011 в 13:13
источник
0

Невозможно сделать ключи отрицательными целыми числами. Если вы хотите сделать отрицательный ключ, вам придется сделать их такими, как это:

var a = {"-1": 'Apple', "-2": 'Orange'}

Затем вы можете делать преобразования взад и вперед с помощью parseInt и toString в вашем другом коде, если это необходимо.

    
ответ дан Ben L 18.11.2011 в 13:14
источник