Как проверить что это массив js
JavaScript | Как проверить на массив?
Как узнать, является ли переменная массивом?
У нас есть две переменные ( massiv и chtoto ):
Как узнать, является ли переменная массивом? Мы хотим получить логическое значение проверки переменной на массив — true или false.
Видео
Как проверить именованные данные?
Консольные выводы в браузере — передаём переменные в качестве аргумента:
JavaScript — Как проверить переменную на массив?
Как узнать, является ли выражение массивом?
Как проверить не именованные данные?
В качестве аргумента функции isArray() прописываем «проверяемые» данные.
Консольные выводы в браузере — передаём массив и объект в качестве аргумента:
JavaScript — Как проверить массив на массив? — Всегда получим истину true
JavaScript — Как проверить объект на массив? — Всегда получим ложь false
Альтернативный способ
Мы можем воспользоваться свойством конструктора объекта и получить его имя класса. Если это имя будет равно « Array «, значит мы имеем дело с классическим массивом JavaScript, а не массиво-подобным объектом.
Проверяем на массив свойством constructor и name — JavaScript
Зачем нужно проверять на массив?
Задача проверки на массив часто встречается в сложных структурах данных, когда нужно погружаться на много уровней в глубину основного массива, чтобы извлекать необходимые данные. Выглядит примерно как рекурсивная распаковка данных — сначала достаём что на уровень ниже, потом то, что ещё на один уровень ниже …и так далее. Вот хороший пример, где нужно проверять на массив: Как узнать глубину каждого элемента массива?
Это очень похоже на то, когда вы приходите из магазина с пакетом еды. Вы точно знаете, что где-то внутри в большом пакете есть средний пакет с фруктами, в который вложен ещё один маленький пакет с яблоками. Так вот если вы хотите получить яблоко, то вы должны погрузиться в самый «глубоко-лежащий» пакет. Вы должны из большого пакета сначала достать средний, а потом из среднего достать маленький. И только потом достать яблоко.
Руководство по JavaScript, часть 5: массивы и циклы
Сегодня, в пятой части перевода курса по JavaScript, мы поговорим о массивах и циклах. Массивы используются в ходе решения множества задач. Часто с массивами работают, используя циклы.
Массивы
Первый элемент массива имеет индекс (ключ) 0, такой подход используется во многих языках программирования.
В этом разделе мы рассмотрим современные методы работы с массивами.
▍Инициализация массивов
Вот несколько способов инициализации массивов.
Для того чтобы получить доступ к отдельному элементу массива, используют конструкцию, состоящую из квадратных скобок, в которых содержится индекс элемента массива. Элементы массивов можно как считывать, так и записывать.
Конструктор Array для объявления массивов использовать не рекомендуется.
Этот способ следует использовать лишь при объявлении типизированных массивов.
▍Получение длины массива
▍Проверка массива с использованием метода every()
Этому методу передаётся функция, принимающая аргументы currentValue (текущий элемент массива), index (индекс текущего элемента массива) и array (сам массив). Он может принимать и необязательное значение, используемое в качестве this при выполнении переданной ему функции.
Например, проверим, превышают ли значения всех элементов массива число 10.
▍Проверка массива с использованием метода some()
▍Создание массива на основе существующего массива с использованием метода map()
Метод массивов map() позволяет перебирать массивы, применяя к каждому их элементу, переданную этому методу, функцию, преобразующую элемент, и создавать из полученных значений новые массивы. Вот, например, как получить новый массив, являющийся результатом умножения всех элементов исходного массива на 2.
▍Фильтрация массива с помощью метода filter()
▍Метод reduce()
Метод reduce() позволяет применить заданную функцию к аккумулятору и к каждому значению массива, сведя массив к единственному значению (это значение может иметь как примитивный, так и объектный тип). Этот метод принимает функцию, выполняющую преобразования, и необязательное начальное значение аккумулятора. Рассмотрим пример.
Здесь мы ищем произведение всех элементов массива, описанного с помощью литерала, задавая в качестве начального значения аккумулятора 1.
▍Перебор массива с помощью метода forEach()
Метод массивов forEach() можно использовать для перебора значений массивов и для выполнения над ними неких действий, задаваемых передаваемой методу функцией. Например, выведем, по одному, элементы массива в консоль.
Если при переборе массива нужно остановить или прервать цикл, то при использовании forEach() придётся выбрасывать исключение. Поэтому если в ходе решения некоей задачи может понадобиться прерывание цикла, лучше всего выбрать какой-нибудь другой способ перебора элементов массива.
▍Перебор массива с использованием оператора for. of
Оператор for. of появился в стандарте ES6. Он позволяет перебирать итерируемые объекты (в том числе — массивы). Вот как им пользоваться.
▍Перебор массива с использованием оператора for
Оператор for позволяет организовывать циклы, которые, в частности, можно использовать и для перебора (или инициализации) массивов, обращаясь к их элементам по индексам. Обычно индекс очередного элемента получают, пользуясь счётчиком цикла.
▍Метод @@iterator
Метод массивов entries() возвращает итератор, который позволяет перебирать пары ключ-значение массива.
Метод keys() позволяет перебирать ключи массива.
▍Добавление элементов в конец массива
▍Добавление элементов в начало массива
▍Удаление элементов массива
▍Удаление элементов массива и вставка вместо них других элементов
Например, здесь мы удаляем 3 элемента массива начиная с индекса 2, после чего в то же место добавляем два других элемента:
▍Объединение нескольких массивов
▍Поиск элементов в массиве
Выглядеть его использование может следующим образом.
Здесь в массиве, содержащем объекты, осуществляется поиск элемента, свойство id которого равняется заданному.
С помощью этого метода можно проверять на наличие некоего элемента не весь массив, а лишь некоторую его часть, начинающуюся с заданного при вызове этого метода индекса. Индекс задаётся с помощью второго, необязательного, параметра этого метода.
▍Получение фрагмента массива
▍Сортировка массива
Для организации сортировки элементов массива в алфавитном порядке ( 0-9A-Za-z ) используется метод sort() без передачи ему аргументов.
▍Получение строкового представления массива
Ему, в качестве аргумента, можно передать разделитель элементов.
▍Создание копий массивов
Метод Array.of() тоже можно использовать для копирования массивов, а также для «сборки» массивов из различных элементов. Например, для копирования элементов одного массива в другой можно воспользоваться следующей конструкцией.
Циклы
Выше, говоря о массивах, мы уже сталкивались с некоторыми способами организации циклов. Однако циклы в JavaScript используются не только для работы с массивами, да и рассмотрели мы далеко не все их виды. Поэтому сейчас мы уделим некоторое время рассмотрению разных способов организации циклов в JavaScript и поговорим об их особенностях.
▍Цикл for
Рассмотрим пример применения этого цикла.
▍Цикл forEach
Этот цикл мы тоже обсуждали. Приведём пример перебора массива с его помощью.
Напомним, что для прерывания такого цикла надо выбрасывать исключение, то есть, если при использовании цикла может понадобиться прервать его, лучше выбрать какой-нибудь другой цикл.
▍Цикл do. while
Это — так называемый «цикл с постусловием». Такой цикл будет выполнен как минимум один раз до проверки условия завершения цикла.
▍Цикл while
Это — так называемый «цикл с предусловием». Если, на входе в цикл, условие продолжения цикла ложно, он не будет выполнен ни одного раза.
▍Цикл for. in
Этот цикл позволяет перебирать все перечислимые свойства объекта по их именам.
▍Цикл for. of
Цикл for. of совмещает в себе удобство цикла forEach и возможность прерывать его работу штатными средствами.
Циклы и области видимости
Выполняя подобный код можно ожидать результата, показанного ниже.
Но на самом деле он выводит следующее.
Так как объявления подобных переменных поднимаются в верхнюю часть области видимости, вышеприведённый код аналогичен следующему.
Как изменить поведение программы таким образом, чтобы она делала бы то, что от неё ожидается?
В частности, в вышеприведённом примере достаточно изменить var на let и всё заработает так, как нужно.
Ещё один способ решения этой проблемы, который часто применялся до появления стандарта ES6, когда ключевого слова let ещё не было, заключается в использовании IIFE.
При таком подходе значение i сохраняется в замыкании, а в массив попадает функция, возвращаемая IIFE и имеющая доступ к замыканию. Эту функцию можно выполнить тогда, когда в ней возникнет необходимость. Вот как это выглядит.
Итоги
Сегодня мы поговорили о массивах и о циклах в JavaScript. Тема нашего следующего материала — обработка исключений, особенности использования точки с запятой и шаблонные литералы.
Уважаемые читатели! Какими методами для работы с массивами в JavaScript вы пользуетесь чаще всего?
Как проверить, является ли переменная массивом в JavaScript? [дубликат]
этот вопрос уже есть ответ здесь:
Я хотел бы проверить, является ли переменная массивом или одним значением в JavaScript.
Я нашел возможное решение.
Это лучший способ сделать это?
23 ответов
существует несколько способов проверить, является ли переменная массивом или нет. Лучшее решение-это то, которое вы выбрали.
это самый быстрый метод на Chrome, и, скорее всего, все другие браузеры. Все массивы являются объектами, поэтому проверка свойства конструктора является быстрым процессом для движков JavaScript.
если у вас возникли проблемы с выяснением, является ли свойство objects массивом, вы должны сначала проверить, является ли свойство там.
некоторые другие способы:
этот последний, на мой взгляд, самый уродливый, и это один из самый медленный. Запуск около 1/5 скорости в качестве первого примера. Матрица.прототип, на самом деле массив. подробнее об этом можно прочитать здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
Итак, еще одно обновление
этот парень самый медленный для проверки массива. Однако, это одна остановка магазин для любого типа, который вы ищете. Однако, поскольку вы ищете массив, просто используйте самый быстрый метод выше.
кроме того, я провел тест:http://jsperf.com/instanceof-array-vs-array-isarray/33 так что повеселись и проверь это.
Примечание: @EscapeNetscape создал еще один тест как jsperf.com вниз. http://jsben.ch/#/QgYAV я хотел убедиться, что оригинальная ссылка остается всякий раз, когда jsperf возвращается в интернет.
вы также можете использовать:
Это кажется мне довольно элегантным решением, но каждому свое.
по состоянию на ES5 теперь также:
но это сломается в старых браузерах, если вы не используете polyfills (в основном. IE8 или похожие).
Я заметил, что кто-то упомянул jQuery, но я не знал, что есть isArray()
есть несколько решений со всеми своими причудами. на этой странице дает хороший обзор. Одним из возможных решений является:
в современных браузерах (и некоторых устаревших браузерах) вы можете сделать
(при поддержке Chrome 5, Firefox 4.0, IE 9, Opera 10.5 и Safari 5)
Если вам нужно поддерживать более старые версии IE, вы можете использовать в ES5-shim и к массиву polyfill.isArray; или добавьте следующее
Если вам не надо обнаружение массивов, созданных в разных кадрах, вы также можете просто использовать instanceof
Примечание: the arguments ключевое слово, которое может быть использовано для доступа к аргументу функции, не является массивом, хотя он (обычно) ведет себя как один:
Это старый вопрос, но с той же проблемой я нашел очень элегантное решение, которым я хочу поделиться.
добавление прототипа в массив делает его очень простым
теперь если у вас есть объект, который вы хотите проверить, чтобы увидеть, если массив все, что вам нужно, чтобы проверить новое свойство
isArray доступен, только если его массив
мне лично нравится предложение Петра:https://stackoverflow.com/a/767499/414784 (для ECMAScript 3. Для ECMAScript 5, Используйте Array.isArray() )
комментарии к сообщению указывают, однако, что если toString() изменяется вообще, этот способ проверки массива завершится ошибкой. Если вы действительно хотите быть конкретным и убедитесь, что toString() не было изменено, и нет никаких проблем с атрибутом класса объектов ( [object Array] является атрибутом класса объекта, который является массивом), тогда я рекомендую сделать что-то вроде этого:
когда я опубликовал этот вопрос, версия JQuery, которую я использовал, не включала
думал, что я добавлю еще один вариант для тех, кто уже может использовать подчеркивание.библиотека js в их сценарии. Подчеркивать.js имеет функцию isArray () (см. http://underscorejs.org/#isArray).
возвращает true, если объект является массивом.
Если вы имеете дело только с EcmaScript 5 и выше, вы можете использовать встроенный Array.isArray функции
Если вы используете Angular, вы можете использовать angular.параметры isarray() функция
в Крокфорд это JavaScript Хорошие Части, есть функция для проверки, является ли данный аргумент массивом:
во-первых, мы спрашиваем, является ли значение истинным. Мы делаем это, чтобы отклонить null и другие ложные значения. Во-вторых, мы спрашиваем, является ли значение typeof «object». Это будет верно для объектов, массивов и (странно) null. В-третьих, мы спрашиваем, имеет ли значение свойство length, которое является числом. Это всегда будет верно для массивов, но обычно не для предметов. В-четвертых, мы спрашиваем, содержит ли значение метод splice. Это снова будет верно для всех массивов. Наконец, мы спрашиваем, является ли свойство length перечислимым (будет ли длина создаваться циклом for in?). Это будет false для всех массивов. Это самый надежный тест для arrayness, который я нашел. К сожалению, это так сложно.
я использовал эту строку кода:
универсальное решение ниже:
начиная с ECMAScript 5, формальным решением является:
кроме того, для старых библиотек JavaScript вы можете найти ниже решение, хотя оно недостаточно точно:
для тех, кто кода-гольф, ненадежный тест с наименьшим количеством символов:
это обычно используется при обходе/уплощение иерархии:
мне понравился ответ Брайана:
но вы могли бы просто сделать вот так:
Я создал этот небольшой код, который может возвращать истинные типы.
Я еще не уверен в производительности, но это попытка правильно определить тип.
он работает, подобно текущему typeof.
он думает, что ему может понадобиться немного тонкой настройки, и принять во внимание вещи, я не сталкивался или проверить его должным образом. поэтому дальнейшие улучшения приветствуются, будь то производительность или неправильный перенос typeOf.
Я думаю, используя myObj.конструктор= = объект и myArray.constructor= = Array-лучший способ. Его почти 20x быстрее, чем с помощью toString(). Если вы расширяете объекты своими собственными конструкторами и хотите, чтобы эти творения считались «объектами», это не работает, но в противном случае его путь быстрее. typeof так же быстро, как метод конструктора, но typeof []==’object’ возвращает true, что часто будет нежелательным. http://jsperf.com/constructor-vs-tostring
следует отметить, что null.конструктор выдаст ошибку, поэтому, если вы можете проверять значения null, вам придется сначала сделать if (testThing!==null) <>
Underscorejs и несколько других библиотек используют этот короткий и простой трюк.
Как проверить, является ли переменная массивом в JavaScript?
Метод Array.isArray () проверяет, является ли переданная переменная объектом Array.
Синтаксис:
Он возвращает истинное логическое значение, если переменная является массивом, и false, если это не так. Это показано в примере ниже.
Пример-1:
How to check if a variable
is an array in JavaScript?
h1 style = «color: green» >
How to check if a variable
is an array in JavaScript?
Click on the button to check
if the variable is an array
p >Output for string:
div class = «outputString» >
p >Output for number:
div class = «outputNumber» >
p >Output for array:
div class = «outputArray» >
button onclick = «checkArray()» >
script type = «text/javascript» >
let str = ‘This is a string’;
let arr = [10, 20, 30, 40];
Выход:
Синтаксис:
Оператор возвращает истинное логическое значение, если переменная такая же, как указано (здесь массив), и ложь, если это не так. Это показано в примере ниже.
Пример-2:
How to check if a variable is
an array in JavaScript?
h1 style = «color: green» >
How to check if a variable is
an array in JavaScript?
Click on the button to check
if the variable is an array
p >Output for string:
div class = «outputString» > div >
p >Output for number:
div class = «outputNumber» > div >
p >Output for array:
div class = «outputArray» > div >
button onclick = «checkArray()» >Click here button >
Массивы
Объекты позволяют хранить данные со строковыми ключами. Это замечательно.
Но довольно часто мы понимаем, что нам необходима упорядоченная коллекция данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д.
В этом случае использовать объект неудобно, так как он не предоставляет методов управления порядком элементов. Мы не можем вставить новое свойство «между» уже существующими. Объекты просто не предназначены для этих целей.
Объявление
Существует два варианта синтаксиса для создания пустого массива:
Практически всегда используется второй вариант синтаксиса. В скобках мы можем указать начальные значения элементов:
Элементы массива нумеруются, начиная с нуля.
Мы можем получить элемент, указав его номер в квадратных скобках:
Мы можем заменить элемент:
…Или добавить новый к существующему массиву:
Общее число элементов массива содержится в его свойстве length :
В массиве могут храниться элементы любого типа.
Список элементов массива, как и список свойств объекта, может оканчиваться запятой:
«Висячая запятая» упрощает процесс добавления/удаления элементов, так как все строки становятся идентичными.
Методы pop/push, shift/unshift
Очередь – один из самых распространённых вариантов применения массива. В области компьютерных наук так называется упорядоченная коллекция элементов, поддерживающая два вида операций:
Массивы поддерживают обе операции.
На практике необходимость в этом возникает очень часто. Например, очередь сообщений, которые надо показать на экране.
Существует и другой вариант применения для массивов – структура данных, называемая стек.
Она поддерживает два вида операций:
Таким образом, новые элементы всегда добавляются или удаляются из «конца».
Примером стека обычно служит колода карт: новые карты кладутся наверх и берутся тоже сверху:
Массивы в JavaScript могут работать и как очередь, и как стек. Мы можем добавлять/удалять элементы как в начало, так и в конец массива.
В компьютерных науках структура данных, делающая это возможным, называется двусторонняя очередь.
Методы, работающие с концом массива:
Удаляет последний элемент из массива и возвращает его:
Добавляет элемент в конец массива:
Методы, работающие с началом массива:
Удаляет из массива первый элемент и возвращает его:
Добавляет элемент в начало массива:
Методы push и unshift могут добавлять сразу несколько элементов:
Внутреннее устройство массива
Следует помнить, что в JavaScript существует 8 основных типов данных. Массив является объектом и, следовательно, ведёт себя как объект.
Например, копируется по ссылке:
…Но то, что действительно делает массивы особенными – это их внутреннее представление. Движок JavaScript старается хранить элементы массива в непрерывной области памяти, один за другим, так, как это показано на иллюстрациях к этой главе. Существуют и другие способы оптимизации, благодаря которым массивы работают очень быстро.
Но все они утратят эффективность, если мы перестанем работать с массивом как с «упорядоченной коллекцией данных» и начнём использовать его как обычный объект.
Например, технически мы можем сделать следующее:
Это возможно, потому что в основе массива лежит объект. Мы можем присвоить ему любые свойства.
Но движок поймёт, что мы работаем с массивом, как с обычным объектом. Способы оптимизации, используемые для массивов, в этом случае не подходят, поэтому они будут отключены и никакой выгоды не принесут.
Варианты неправильного применения массива:
Эффективность
Методы push/pop выполняются быстро, а методы shift/unshift – медленно.
Почему работать с концом массива быстрее, чем с его началом? Давайте посмотрим, что происходит во время выполнения:
Просто взять и удалить элемент с номером 0 недостаточно. Нужно также заново пронумеровать остальные элементы.
Операция shift должна выполнить 3 действия:
Чем больше элементов содержит массив, тем больше времени потребуется для того, чтобы их переместить, больше операций с памятью.
То же самое происходит с unshift : чтобы добавить элемент в начало массива, нам нужно сначала сдвинуть существующие элементы вправо, увеличивая их индексы.
Действия при операции pop :
Метод pop не требует перемещения, потому что остальные элементы остаются с теми же индексами. Именно поэтому он выполняется очень быстро.
Перебор элементов
Одним из самых старых способов перебора элементов массива является цикл for по цифровым индексам:
Но для массивов возможен и другой вариант цикла, for..of :
Цикл for..of не предоставляет доступа к номеру текущего элемента, только к его значению, но в большинстве случаев этого достаточно. А также это короче.
Технически, так как массив является объектом, можно использовать и вариант for..in :
Но на самом деле это – плохая идея. Существуют скрытые недостатки этого способа:
Цикл for..in выполняет перебор всех свойств объекта, а не только цифровых.
В браузере и других программных средах также существуют так называемые «псевдомассивы» – объекты, которые выглядят, как массив. То есть, у них есть свойство length и индексы, но они также могут иметь дополнительные нечисловые свойства и методы, которые нам обычно не нужны. Тем не менее, цикл for..in выведет и их. Поэтому, если нам приходится иметь дело с объектами, похожими на массив, такие «лишние» свойства могут стать проблемой.
Цикл for..in оптимизирован под произвольные объекты, не массивы, и поэтому в 10-100 раз медленнее. Увеличение скорости выполнения может иметь значение только при возникновении узких мест. Но мы всё же должны представлять разницу.
В общем, не следует использовать цикл for..in для массивов.
Немного о «length»
Свойство length автоматически обновляется при изменении массива. Если быть точными, это не количество элементов массива, а наибольший цифровой индекс плюс один.
Например, единственный элемент, имеющий большой индекс, даёт большую длину:
Обратите внимание, что обычно мы не используем массивы таким образом.
Ещё один интересный факт о свойстве length – его можно перезаписать.
Если мы вручную увеличим его, ничего интересного не произойдёт. Зато, если мы уменьшим его, массив станет короче. Этот процесс необратим, как мы можем понять из примера:
new Array()
Существует ещё один вариант синтаксиса для создания массива:
Он редко применяется, так как квадратные скобки [] короче. Кроме того, у него есть хитрая особенность.
Если new Array вызывается с одним аргументом, который представляет собой число, он создаёт массив без элементов, но с заданной длиной.
Давайте посмотрим, как можно оказать себе медвежью услугу:
Многомерные массивы
Массивы могут содержать элементы, которые тоже являются массивами. Это можно использовать для создания многомерных массивов, например, для хранения матриц: