Есть ли способ использовать числовой тип в качестве ключа объекта?
Кажется, что когда я использую числовой тип в качестве имени ключа в объекте, он всегда преобразуется в строку. Есть ли вообще, чтобы на самом деле заставить его хранить цифру? Обычное приведение типов не работает.
Пример:
var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);
Выходной сигнал:
{
'1': 'a value'
}
Что я хочу:
{
1: 'a value'
}
Совет
Спасибо
Ответы
Ответ 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()
или []
).