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
    }
});​

Fiddle

Author: Community, 2012-10-21

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);
 166
Author: gdoron,
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

Tutaj wpisz opis obrazka


Aby dodać tło, w JavaScript są dwa typy danych:

  1. prymitywne typy danych - obejmuje to null, undefined, string, boolean, number i sprzeciw.
  2. 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:

  1. Długość - może być równa 0 lub wyższa (nieujemna).
  2. 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!

 17
Author: Prinzhorn,
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

 4
Author: Reflective,
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 = {};
 -5
Author: feeela,
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