Почему typeof array с объектами возвращает "Object", а не"Array"? [дубликат]

Возможные Дубликаты:
JavaScript: проверьте, является ли объект array?

почему массив объектов считается объектом, а не массивом? Например:

$.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 ответов


одним из странных поведения и спецификаций в Javascript является массив typeof Object.

вы можете проверить, является ли переменная массивом несколькими способами:

var isArr = data instanceof Array;
var isArr = Array.isArray(data);

но самый надежный способ-это:

isArr = Object.prototype.toString.call(data) == '[object Array]';

поскольку вы отметили свой вопрос с помощью jQuery, вы можете использовать jQuery isArray функция:

var isArr = $.isArray(data);

со ссылкой на спецификации

15.4 Объекты Array

объекты Array дать специальное обращение к определенному классу имен свойств. Имя свойства P(в виде строкового значения) является индексом массива тогда и только тогда, когда ToString(ToUint32(P)) равен P, а ToUint32 (P) не равен 2^32-1. Свойство, имя свойства которого является индексом массива, также называется элементом. Каждый объект массива имеет свойство length, значение которого всегда является неотрицательным целым числом меньше 2^32. Значение свойства length численно больше, чем имя каждого свойства, имя которого является индексом массива; всякий раз, когда свойство объекта массива создается или изменяется, другие свойства корректируются по мере необходимости для поддержания этого инварианта. В частности, всякий раз, когда добавляется свойство, имя которого является индексом массива, свойство length при необходимости изменяется на одно больше, чем числовое значение этого индекса массива; и всякий раз, когда изменяется свойство length, каждое свойство имя индекса массива, значение которого не меньше новой длины, автоматически удаляется. Это ограничение применяется только к собственным свойствам объекта Array и не зависит от свойств индекса length или array, которые могут быть унаследованы от его прототипов.

и вот таблица для typeof

enter image description here


чтобы добавить некоторый фон, в JavaScript есть два типа данных:

  1. Примитивные Данные типы - сюда входят null, undefined, string, boolean, number и object.
  2. производные типы данных/специальные объекты - к ним относятся функции, массивы и регулярные выражения. И да, все они получены из "объекта" в JavaScript.

объект в JavaScript похож по структуре на ассоциативный массив / словарь, наблюдаемый в большинстве объектно-ориентированных языков, т. е. он имеет набор пар ключ-значение.

массив может быть считается объектом со следующими свойствами / ключами:

  1. длина - это может быть 0 или выше (неотрицательным).
  2. индексы массива. Под этим я подразумеваю "0", "1", "2", etc-все свойства объекта array.

надеюсь, это помогло пролить больше света на то, почему typeof Array возвращает объект. Ура!


попробуйте этот пример, и вы также поймете, в чем разница между ассоциативным массивом и объектом в JavaScript.

Ассоциативный Массив

var a = new Array(1,2,3); 
a['key'] = 'experiment';
Array.isArray(a);

возвращает true

имейте в виду, что a.length будет неопределенным, потому что length рассматривается как ключ, вы должны использовать Object.keys(a).length чтобы получить длину ассоциативного массива.

объект

var a = {1:1, 2:2, 3:3,'key':'experiment'}; 
Array.isArray(a)

возвращает false

JSON возвращает объект ... может возвращать ассоциативный массив ... но это не так!--8-->


в вашем коде нет простого массива JS. The data является собственным объектом JS. Имейте в виду различные значения различных типов скобок:

var someArray = [];
var someObject = {};