Почему 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
чтобы добавить некоторый фон, в JavaScript есть два типа данных:
- Примитивные Данные типы - сюда входят null, undefined, string, boolean, number и object.
- производные типы данных/специальные объекты - к ним относятся функции, массивы и регулярные выражения. И да, все они получены из "объекта" в JavaScript.
объект в JavaScript похож по структуре на ассоциативный массив / словарь, наблюдаемый в большинстве объектно-ориентированных языков, т. е. он имеет набор пар ключ-значение.
массив может быть считается объектом со следующими свойствами / ключами:
- длина - это может быть 0 или выше (неотрицательным).
- индексы массива. Под этим я подразумеваю "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 = {};