Как проверить, является ли переменная массивом в JavaScript?
В JavaScript мы можем проверить, является ли переменная массивом, используя 3 метода, используя метод isArray , используя оператор instanceof и проверяя тип конструктора, если он соответствует объекту Array.
- Метод 1: Использование метода isArray
Метод 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];
Выход:
Синтаксис:
Оператор возвращает истинное логическое значение, если переменная такая же, как указано (здесь массив), и ложь, если это не так. Это показано в примере ниже.
Как проверить, является ли переменная массивом в JavaScript? [дубликат]
Я хотел бы проверить, является ли переменная массивом или одним значением в JavaScript.
Я нашел возможное решение.
Это лучший способ сделать это?
23 ответов
существует несколько способов проверить, является ли переменная массивом или нет. Лучшее решение-это то, которое вы выбрали.
это самый быстрый метод на Chrome, и, скорее всего, все другие браузеры. Все массивы являются объектами, поэтому проверка свойства конструктора является быстрым процессом для движков JavaScript.
если у вас возникли проблемы с выяснением, является ли свойство objects массивом, вы должны сначала проверить, является ли свойство там.
некоторые другие способы:
этот метод работает о 1/3 скорости в качестве первого примера. Все еще довольно твердый, выглядит чище, если вы все о красивом коде и не так много на производительности. Обратите внимание, что проверка номеров не работает как variable instanceof Number всегда возвращает false . обновление: instanceof сейчас идет 2/3 скорости!
этот последний, на мой взгляд, самый уродливый, и это один из самый медленный. Запуск около 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; или добавьте следующее
если вы используете jQuery, вы можете использовать jQuery.isArray(obj) или $.isArray(obj) . Если вы используете подчеркивание, вы можете использовать _.isArray(obj)
Если вам не надо обнаружение массивов, созданных в разных кадрах, вы также можете просто использовать instanceof
Примечание: the arguments ключевое слово, которое может быть использовано для доступа к аргументу функции, не является массивом, хотя он (обычно) ведет себя как один:
Это старый вопрос, но с той же проблемой я нашел очень элегантное решение, которым я хочу поделиться.
добавление прототипа в массив делает его очень простым
теперь если у вас есть объект, который вы хотите проверить, чтобы увидеть, если массив все, что вам нужно, чтобы проверить новое свойство
isArray доступен, только если его массив
основной недостаток Крокфорд упоминает неспособность правильно определить массивы, которые были созданы в другом контексте, например, window . Эта страница имеет гораздо более сложную версию, если этого недостаточно.
мне лично нравится предложение Петра:https://stackoverflow.com/a/767499/414784 (для ECMAScript 3. Для ECMAScript 5, Используйте Array.isArray() )
комментарии к сообщению указывают, однако, что если toString() изменяется вообще, этот способ проверки массива завершится ошибкой. Если вы действительно хотите быть конкретным и убедитесь, что toString() не было изменено, и нет никаких проблем с атрибутом класса объектов ( [object Array] является атрибутом класса объекта, который является массивом), тогда я рекомендую сделать что-то вроде этого:
обратите внимание, что в JavaScript The Definitive Guide 6th edition, 7.10, говорится Array.isArray() реализуется с помощью Object.prototype.toString.call() в ECMAScript 5. Также обратите внимание, что если вы собираетесь беспокоиться о toString() реализация меняется, вы также должны беспокоиться о каждом другом встроенном изменении метода. Зачем использовать push() ? Кто-то может это изменить! Такой подход глуп. Вышеуказанная проверка является предлагаемым решением для тех, кто беспокоится о toString() меняется, но я считаю, что чек не нужен.
когда я опубликовал этот вопрос, версия 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) <>
Так .свойство length для массива в JavaScript, вы можете просто сказать
Underscorejs и несколько других библиотек используют этот короткий и простой трюк.
Как проверить, является ли переменная типизированным массивом в javascript?
Я работаю над игрой, и мы широко используем типизированные массивы (Float32Arrays) для наших математических типов. Мы сохраняем и загружаем игру от JSON. Примером вывода строки JSON для такого массива (в Chrome) является:
Это освобождает пространство и заставляет их загружаться как объекты, которые неудобны. В идеале мы могли бы использовать функцию substitute ‘replacer’, чтобы проверить, является ли переменная типизированным массивом, а затем преобразует ее в стандартный массив bog. К сожалению, я не уверен, как надежно проверить, является ли переменная типизированным массивом или нет.
Если вы довольны тем, что он является Float32Array или подклассом Float32Array и они будут из той же области (свободно, окно), что и код, который вы проверяете, посмотрите ответ Антона с помощью instanceof .
Если вам нужно знать, что это именно Float32Array а не подкласс (и он из той же области), вы можете использовать yourObject.constructor === Float32Array :
Но обратите внимание, что произойдет сбой, если объект происходит из другой области (например, из другого фрейма), потому что разные среды имеют разные конструкторы Float32Array (даже если они делают одно и то же).
Если вам нужно поддерживать случаи, когда constructor не работает, вы можете использовать трюк Object.prototype.toString.call(yourObject) . Это возвращает полезную строку для всех встроенных типов JavaScript ( [object Array] , [object Date] и т.д.). По спецификации Object.prototype.toString при применении к типизированному массиву должен возвращать строку в формате «[object TypedArrayNameHere]» .
Обратите внимание, что можно создавать объекты, которые лгут о своем типе, заставляя Object.prototype.toString возвращать то же самое, что он возвращает для (скажем) Float32Array :
ArrayBuffer.isView должен помочь вам.
Вы также можете использовать конструкцию yourObject instanceof Float32Array .
Он возвращает true , если ваш объект является экземпляром Float32Array и false в другом случае.
Если вам нужен более общий тест, который ловит любые типы ArrayBufferView и DataView, вы можете использовать:
Я удивлен, что никто не получил этого ниже. Это должно работать в большинстве случаев, чтобы выяснить, есть ли у вас типизированный массив:
Конечно, это “утиная печать”, а a instanceof Float32Array или аналогичный – лучший способ узнать наверняка для определенных типов.
Все типизированные массивы наследуются от ArrayBuffer. Этот тип содержит свойство byteLength, поэтому просто проверьте, доступно ли это свойство.
Как правильно проверить тип переменной в JavaScript
JavaScript или JS (сокращенно) не простой язык и начинающие разработчики узнают об этом не сразу. По началу они узнают азы и все кажется красочным и прекрасным. Заходя чуть глубже, появляются JavaScript массивы, объекты, callback’и и все подобное, что часто выносит мозг.
В JavaScript важно правильно проверять тип переменной. Допустим вы хотите узнать является ли переменная массивом или объектом? Как это правильно проверить? В этом конкретном случае, есть хитрости во время проверки и именно о них будет эта запись. Давайте сразу приступим.
Проверка типа переменной
Например вам нужно проверить является переменная объектом, массивом, строкой или числом. Для этого можно использовать typeof , но она не всегда выдаст правду и в примере ниже я покажу почему.
Этот пример я написал, чтобы наглядно показать, почему typeof не всегда правильный выбор.
Результат выполнения кода:
Верно? — Нет, конечно. Есть две проблемы. Каждая из них будет подробно описана и предложено решение.
Первая проблема: float число, выводится как number
_comparison.float не является числом и вместо number должно быть float (число с плавающей точкой).Чтобы это исправить, можно создать функцию с проверкой как в коде ниже.
Функция isFloat() выполняет проверку всех значений на числа с плавающей точкой. Сначала проверяется равна ли переменная n числу ( Number(n) === n ) и если да, то делается еще одна проверка на деление с остатком и если остаток есть, то возвращается булевой (true или false) результат ( n % 1 !== 0 ).
В примере выше она возвращает true, false и false. Первое значение имеет float тип, второе нет — это обычное число и последнее всего лишь пустая строка, которая не подходит под правила.
Вторая проблема: массив определился как объект
В самом первом примере, массив отобразился как объект и это не очень хорошо, так как иногда вам нужно использоваться именно этот тип и ничего больше.
Есть несколько способов для проверки переменной на тип массива.
Первый вариант (хороший вариант). Проверяем принадлежность data к массиву с помощью instanceof (подробнее).
Второй вариант (хороший вариант). Метод Array.isArray() возвращает булевое значение, которе будет зависеть от того является ли переменная массивом или нет (подробнее).
Третий вариант (самый лучший, но длинный). Для удобности, вы можете сделать этот способ функцией. Используя Object, мы делаем [object Array]. Если результат Object.prototype.toString.call(data) не равен [object Array] значит переменная не массив (подробнее).
Последний результат в виде удобной функции:
Теперь вы можете вызвать функции isArray() и как аргумент задать массив или что-то иное и посмотреть результат.
Послесловие
Запись получилась достаточно большой, чем изначально задумывалась. Но я ей доволен, потому что она достаточно кратко и четко описывает затруднения при проверке переменных в JavaScript и как их обойти.
Если у вас остались какие-либо вопросы — пишите их ниже к этому записи. Я буду рад помочь.