2010-09-03 3 views
43

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

Пример:

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

Dir Выход:

{ 
    '1': 'a value' 
} 

То, что я хочу это:

{ 
    1: 'a value' 
} 

Совет?

Благодаря

ответ

48

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

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

> var foo = {} 
undefined 

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

> foo 
{ '23213': 'swag' } 

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

спасибо. Является ли это признаком ошибки на этом языке или принято в качестве хорошего дизайнерского решения? – Spot

+1

Это довольно субъективно. Как отметил Уильям, для целых ключей вы можете вместо этого использовать массив. Большинство двигателей JS могут использовать разреженные массивы за кулисами. –

+3

Даже в массиве все имена свойств преобразуются в строки. –

-3

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

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

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

+2

Благодарим за отзыв, но это не совсем точно. Числовое число будет возвращаться только как «число» из typeof, и наоборот с строкой. – Spot

+0

@william 'числовые строки и числа взаимозаменяемы' просто неверны. Числа - это числа, а строки - это строки. См. 'Object.prototype.toString.call (someObject)' Проблема заключается в том, что вы не можете использовать клавиши Numbers as. – mikemaccana

7

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

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

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

10

В объекте нет, но я нашел 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)(); 
    } 
} 
Смежные вопросы