Wygląda na to, że kiedy używam typu numerycznego jako nazwy klucza w obiekcie, zawsze jest on konwertowany na ciąg. Czy w ogóle istnieje możliwość zapisania go jako liczby? Wydaje się, że normalne rzutowanie nie działa.
Przykład:
var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);
Wyjście z katalogu:
{
'1': 'a value'
}
Co ja chce to:
{
1: 'a value'
}
Rada?
Odpowiedzi:
Nie, to niemożliwe. Klucz będzie zawsze konwertowany na ciąg. Zobacz dokumentację Property Accessor
> var foo = {} undefined > foo[23213] = 'swag' 'swag' > foo { '23213': 'swag' } > typeof(Object.keys(foo)[0]) 'string'
źródło
length
właściwość tablicy .myArray["1"] = foo
, wydaje się ustawiać właściwość, podczas gdy w rzeczywistości ustawia element tablicy, ale tylko dlatego, że „1” jest ciągiem reprezentującym liczbę całkowitą, co jest kompletnym lingwistycznym nonsensem - ale to jest JavaScript.myArray["1"] = foo
nie tylko wydaje się być ustawieniem właściwości, w rzeczywistości jest to ustawienie właściwości (z kluczem „1”) w każdym znaczeniu definicji właściwości. Np .myArray.hasOwnProperty("1")
Plonytrue
. Pod względem semantycznym tę właściwość można również uznać za „element” ze względu na posiadanie klucza numerycznego, ale nie ma nic ponadto, co odróżnia „element” tablicy od właściwości tablicy. Przeczytaj specyfikację. Jeśli nadal się nie zgadzasz, zacytuj swoje źródło.W przypadku obiektu, nie, ale okazało się, że Mapa jest niezwykle przydatna w tej aplikacji. Oto, gdzie użyłem go do klawiszy numerycznych, zdarzenia opartego na kluczach.
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)(); } }
źródło
Wydaje się być zgodne z projektem w ECMA-262-5:
Jednak nie widzę konkretnej specyfikacji tego w ECMA-262-3. Niezależnie od tego nie próbowałbym używać znaków niebędących ciągami znaków jako nazw właściwości.
źródło
Czy potrzebujemy czegoś takiego?
var userId = 1;var myObject ={}; console.log( typeof userId ); // number myObject[userId] = 'a value'; console.dir(myObject);
Konsola: obiekt
1: „wartość”
źródło
Myślę, że możesz wykonać następujące czynności, jeśli chcesz użyć powyższej rzeczy, aby uzyskać dostęp do niej jako liczby, zrobiłem to samo i działałem.
var myObj = {"0":"a","1":"b","CNT":2}; $.each(myObj,function(key,value){ if(isNaN(parseInt(key))){ return true; //continue; } //Code to perform operation }
Działa to tylko wtedy, gdy klucz nie zaczyna się od i znaku numerycznego, w przeciwnym razie zostanie przekonwertowany na liczbę. Zobacz poniższy przykład:
parseInt("45kjghk") === 45
Użyłem tutaj jQuery
Zaktualizowano:
var myObj = {"0":"a","1":"b","CNT":2}; $.each(myObj,function(key,value){ if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){ return true; //continue; } //Code to perform operation }
Może rozwiązać powyższy problem. Proszę zasugerować lepsze, jeśli są dostępne, i problem z tą odpowiedzią, jeśli istnieją.
źródło
W JavaScript ciągi liczbowe i liczby są wymienne, więc
myObject[1] == myObject['1']
Jeśli naprawdę chcesz, aby liczba była kluczem do obiektu, możesz potrzebować tablicy (tj. Utworzonej za pomocą
new Array()
lub[]
).źródło
Object.prototype.toString.call(someObject)
Problem polega na tym, że nie możesz używać liczb jako klawiszy.