Dlaczego typeof array z obiektami zwraca "Object", a nie "Array"? [duplikat]
Możliwy duplikat:
JavaScript: sprawdź, czy obiekt jest tablicą?
Dlaczego tablica obiektów jest uważana za obiekt,a nie tablicę? Na przykład:
$.ajax({
url: 'http://api.twitter.com/1/statuses/user_timeline.json',
data: { screen_name: 'mick__romney'},
dataType: 'jsonp',
success: function(data) {
console.dir(data); //Array[20]
alert(typeof data); //Object
}
});
4 answers
Jednym z dziwnych zachowań i specyfikacji w Javascript jest typeof Array is Object
.
Możesz sprawdzić, czy zmienna jest tablicą na kilka sposobów:
var isArr = data instanceof Array;
var isArr = Array.isArray(data);
Ale najbardziej wiarygodnym sposobem jest:
isArr = Object.prototype.toString.call(data) == '[object Array]';
Ponieważ otagowałeś swoje pytanie jQuery, możesz użyć jQuery isArray
funkcja:
var isArr = $.isArray(data);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 10:11:49
Cytowanie spec
15.4 Obiekty Tablicy
Obiekty Array nadają specjalne traktowanie określonej klasie nazw właściwości. Nazwa właściwości P (w postaci wartości łańcuchowej) jest indeksem tablicy wtedy i tylko wtedy, gdy ToString (ToUint32(P)) jest równy P, A ToUint32(P) nie jest równy 2^32-1. Właściwość, której nazwa jest indeksem tablicy, nazywana jest również elementem. Każdy obiekt tablicy ma właściwość length, której wartość jest zawsze liczbą całkowitą nieujemną mniejszą niż 2^32. Wartość właściwość length jest liczbowo większa niż nazwa każdej właściwości, której nazwa jest indeksem tablicy; za każdym razem, gdy właściwość obiektu Array jest tworzona lub zmieniana, inne właściwości są dostosowywane w razie potrzeby, aby zachować tę niezmienność. W szczególności, za każdym razem, gdy dodawana jest właściwość, której nazwa jest indeksem tablicy, właściwość length jest zmieniana, jeśli to konieczne, tak, aby była o jedną więcej niż wartość liczbowa tego indeksu tablicy; i za każdym razem, gdy właściwość length jest zmieniana, każda właściwość, której nazwa jest tablicą indeks, którego wartość nie jest mniejsza niż nowa długość, jest automatycznie usuwany. Ograniczenie to ma zastosowanie tylko do własnych właściwości obiektu Array i nie ma wpływu na długość lub właściwości indeksu tablicy, które mogą być dziedziczone z jego prototypów.
A oto tabela dla typeof
Aby dodać tło, w JavaScript są dwa typy danych:
- prymitywne typy danych - obejmuje to null, undefined, string, boolean, number i sprzeciw.
- pochodne typy danych / Obiekty specjalne - obejmują funkcje, tablice i wyrażenia regularne. I tak, wszystkie one pochodzą z "obiektu" w JavaScript.
Obiekt w JavaScript jest podobny w strukturze do tablicy asocjacyjnej / słownika widzianego w większości języków obiektowych-tzn. posiada zestaw par klucz-wartość.
Tablicę można uznać za obiekt o następującej właściwości / klucze:
- Długość - może być równa 0 lub wyższa (nieujemna).
- indeksy Tablicy . Przez to mam na myśli "0", "1", "2", itd to wszystkie właściwości obiektu array.
Hope this helped shed more light on why typeof Array returns an object. Zdrowie!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 19:32:30
Wypróbuj ten przykład, a zrozumiesz również, jaka jest różnica między tablicą asocjacyjną a obiektem w JavaScript.
Tablica Asocjacyjna
var a = new Array(1,2,3);
a['key'] = 'experiment';
Array.isArray(a);
Zwraca true
Należy pamiętać, że a.length
będzie niezdefiniowany, ponieważ length
jest traktowany jako klucz, należy użyć Object.keys(a).length
, aby uzyskać długość tablicy asocjacyjnej.
Obiekt
var a = {1:1, 2:2, 3:3,'key':'experiment'};
Array.isArray(a)
Zwraca false
JSON zwraca obiekt ... może zwrócić tablicę asocjacyjną ... ale to nie tak
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 10:11:53
Nie ma zwykłej tablicy JS w Twoim kodzie. {[1] } jest natywnym obiektem JS. Należy pamiętać o różnych znaczeniach różnych typów nawiasów:
var someArray = [];
var someObject = {};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 10:09:33