Подтвердить что ты не робот

Есть ли способ использовать числовой тип в качестве ключа объекта?

Кажется, что когда я использую числовой тип в качестве имени ключа в объекте, он всегда преобразуется в строку. Есть ли вообще, чтобы на самом деле заставить его хранить цифру? Обычное приведение типов не работает.

Пример:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Выходной сигнал:

{
    '1': 'a value'
}

Что я хочу:

{
    1: 'a value'
}

Совет

Спасибо

4b9b3361

Ответ 1

Нет, это невозможно. Ключ всегда будет преобразован в строку. См. Документы Access Accessor

Имена свойств должны быть строками. Это означает, что нестроковые объекты не могут использоваться в качестве ключей в объекте. Любой нестроковый объект, включая число, вводится в строку через метод toString.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'

Ответ 2

Появляется дизайн в ECMA-262-5:

Тип идентификатора свойства используется для связывания имени свойства с дескриптором свойств. Значения типа Идентификатор свойства являются парами формы (имя, дескриптор), где name является строкой, а дескриптор - значением дескриптора свойства.

Однако я не вижу в ECMA-262-3 определенной спецификации. Независимо от того, я бы не стал использовать non-strings в качестве имен свойств.

Ответ 3

В объекте нет, но я нашел Map чрезвычайно полезным для этого приложения. Здесь я использовал его для цифровых клавиш, событий на основе клавиш.

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}

Ответ 4

В JavaScript числовые строки и числа взаимозаменяемы, поэтому

myObject[1] == myObject['1']

Если вы действительно хотите, чтобы число было ключом для объекта, вам может понадобиться массив (т.е. созданный с помощью new Array() или []).