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

Возможный дубликат:

JavaScript: Проверить, является ли объект массивом?

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

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

скрипка

 pimvdb21 окт. 2012 г., 12:07
Тот'шоуtypeof определяется, но вы можете использовать.Array.isArray
 ZAD-Man08 нояб. 2018 г., 00:12
Это'странно, что это помечено как дубликат другого вопроса, который выглядит совсем по-другому ...

Ответы на вопрос(4)

Решение Вопроса

rray.Object

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

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

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

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

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

var isArr = $.isArray(data);
 Jan Chalupa08 дек. 2015 г., 14:02
Вы можете определить, есть ли у вас массив или объект, используя этот способ:if(typeof myArrayOfObject[0] == "object"), Еслиtrue тогда у вас есть объект, еслиfalse тогда у вас есть массив.
 gdoron26 июл. 2015 г., 00:05
@ м, тыверно, но не поддерживается в старых браузерах.посмотреть здесь
 gdoron13 февр. 2014 г., 20:45
@ Алекс, да, другой может дать тебеfalse если ты'проверяет массив, который вы получили от.
 Johan21 окт. 2012 г., 12:15
Другими словами,typeof никогда не вернешьсяArray "?"
 Alex13 февр. 2014 г., 04:02
Но самый надежный способ это: ... » То есть другие предложенные вами способы ненадежны?
 Mark Fox25 июл. 2015 г., 23:27
@gdoron MDN, кажется, указывает на то, чтоArray.isArray(…) должен быть надежнымdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...?

и вы поймете также, в чем разница между ассоциативным массивом и объектом в 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 возвращает объект ... может вернуть ассоциативный массив ... но это не так

 pimvdb21 окт. 2012 г., 12:44
У JSON также есть концепция массивов. (И индексы массива начинаются с 0.)
 Reflective21 окт. 2012 г., 14:20
При всем моем уважении, в JavaScript есть такая вещь, как Ассоциативный массив ... проверь это ...что я пытался объяснить ... и чтопочтение, когда вы звонитеisArray, Ассоциативный массив - это HASH в Perl, например, или обычно называемый словарь. В JSON такого представления нет. Поэтому ассоциативный массив обрабатывается как объект со свойствами.
 Reflective21 окт. 2012 г., 12:50
Парень определил свои данные как {...} - Object ... I 'я пытаюсь объяснить ему, чтоРазница между ч / б ассоциативным массивом и объектами. На самом деле он проверяет дату, возвращаемую сервером, так чтоне то же самое ... но, может быть, вы правы ... должны это проверить :)
 Reflective21 окт. 2012 г., 22:58
Возможно, это зависит от браузера моего мастера, но в любом случае это не правильная длина ... Если у вас есть только ключи, это будет 0, но я 'Я рад, что ты наконец понял, что яЯ говорю о. Я'я не говорю о массиве[1,2,3]» который является абсолютно регулярным массивом. Прочитай внимательно. Добавление ключаключ» делает его ассоциативным (HASH, словарь). Не я даю имена,покажи это'называется. В последний раз: тамРазличия ч / б доц. массив и объект - isArray вернетtrue для доц. массив иfalse для объекта. Google: ассоциативный массив javascript
 nnnnnn21 окт. 2012 г., 22:34
JSON представление массива:"[1,2,3]" - при разборе создаст массив[1,2,3] который имеет.length из3 и для чегоArray.isArray() вернусьtrue, т.е.,Array.isArray(JSON.parse("[1,2,3]")) являетсяtrue (попытайся). Что вы называетеассоциативный массив " в вашем ответе стандартный JS-массив с добавленными дополнительными нечисловыми свойствами, который не может быть представлен в JSON (кроме как объект, не являющийся массивом, который вынужно преобразовать в массив).
 nnnnnn21 окт. 2012 г., 19:56
JSON определенно делаетне "перевести все массивы, переданные строками JSON, в объекты ", При анализе такие массивы - с использованием квадратных скобок - становятся настоящими массивами JS, а не объектами. Кроме того, в первом примере в вашем ответе a.length не будет неопределенным, это будет 3.
 pimvdb21 окт. 2012 г., 15:42
Но как это отвечает на вопрос? ОП имеет массив, иtypeof дает"object", Он'Интересно, почему это происходит? Короче говоря, вопрос: почемуtypeof [] не дают"array"? Ты нене могу ответить на этот вопрос.
 Reflective21 окт. 2012 г., 20:28
Около.length - вы должны сначала попробовать (как показано в примере выше) ...will be Безразлично»значитit is ... и понятно объяснил почему. Об массивах: я говорил об ассоциативных массивах, может бытьнеясно, потому что я написал сотни строк и могу ли я пропустить это уточнение. Но скажите, пожалуйста, как ассоциативный массив представлен в JSON? Отвечая на этот квест, вы окончательно прекратите эту бесконечную дискуссию. И когда вы найдете это.length не работает для ассоциативного массива, будьте настолько смелы, чтобы сказать - "ок, моя ошибка
 nnnnnn21 окт. 2012 г., 22:36
Постскриптум В вашем примереa.length будет -3вы попробуйте, вы тот, кто ошибается здесь.length свойство будет на единицу выше, чем наивысшее индексированное свойство в массиве, т. е. оно игнорирует любые дополнительные нечисловые свойства, которые вы добавляете, например, вашa['key'] пример - ноlength будутне быть неопределенным - возможно, это то, что вы пытались сказать. "ассоциативный массив " существует в других языках, но в JavaScript наиболее близким является простой объект.
 pimvdb21 окт. 2012 г., 16:15
Там'Здесь нет ничего плохого в JSON;data на самом деле массив. ОП вообще не использует ассоциативные массивы. Вопрос почемуtypeof дает"object" когда используется на массиве. Но я думаю, мыговорим на разных длинах волн.
 Reflective21 окт. 2012 г., 13:02
Можете ли вы привести пример ассоциативного массива JSON? Что-то вроде того:jQuery.parseJSON('{"name":"John"}') ... Этот обычно принимается как Объект. Как вы думаете, JSON представляет ассоциативный массив?
 Reflective21 окт. 2012 г., 23:08
Читая ваши ответы, я думаю, вы никогда не слышали об ассоциативных массивах и неЯ не верю в их существование :) Во всяком случае, подобные обсуждения бесполезны. Победил'я провожу время в контактах из-за вещей, которые можно легко проверить.
 Reflective21 окт. 2012 г., 17:08
во всяком случае ... этобесполезно продолжать говорить об этом :)мелодия нановейшие вопросы канал;)
 Reflective21 окт. 2012 г., 17:00
{ key: value } определяет объект, а не массив. Как вы знаете, чтобы определить массив, вы должны сделать['mick__romney'], Другое дело, чтоdata парень проверяет результат из анализатора запросов AJAX и не имеет ничего общего с параметромdata: в настройках AJAX. Ответ в том, что JSON переводит все массивы, переданные строками JSON, в объекты. Можно'не быть другим, не так лине имеет значения, если они выглядят как массив. Много способов справиться с проблемой, например,try { var a = data.scrren_name; isArray = true; } catch (e) { isArray = false;} ... но это'Хорошо бы немного глубже погрузиться в проблему.
 pimvdb21 окт. 2012 г., 14:15
В JSON нет такой вещи, которую вы называете ассоциативным массивом. Но я'я не уверен, что тыПытаюсь сказать своим ответом относительно вопроса.
 Reflective21 окт. 2012 г., 15:55
Отвечает на половину вопросов о том, что JSON возвращает объект, а не массив, и дает некоторую дополнительную информацию о том, что из-за синтаксиса JSON всегда анализирует массивы как объекты, а не как ассоциативный массив, что можно сделать, поскольку ассоциативный массив существует как тип, но К сожалению, JSON не работает таким образом и не возвращает ассоциативный массив. Ассоциативный массив имеет некоторые недостатки, и этохорошо использовать объекты. Например, получить длину, которую я объяснил в своем ответе. Таким образом, идея состоит в том, чтобы понять, почему они используют объекты, анализирующие строку JSON. По крайней мере, вы узнали что-то. Правильно?

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

var someArray = [];
var someObject = {};
 Johan21 окт. 2012 г., 12:12
Да, но он все еще упакован в массив. Так что, по моему мнению, он все еще должен возвращать массив ».
 nnnnnn21 окт. 2012 г., 12:22
Данные являются родным объектом JS " - Нет, ФП спрашивает оdata параметр в функции успеха (который будет массивом, если этоs, что обработанный ответ jsonp закончился как).

15.4 Массив объектов

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

И здесь'стол дляtypeof

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

Примитивные типы данных - Это включает в себя ноль, неопределенный, строка, логическое значение, число и объект.Производные типы данных / Специальные объекты - К ним относятся функции, массивы и регулярные выражения. И да, это все происходит отОбъект» в JavaScript.

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

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

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

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

 Potatoes27 июл. 2017 г., 04:32
объект не является примитивным согласно:developer.mozilla.org/en-US/docs/Glossary/Primitive

Ваш ответ на вопрос