JavaScript: определить, является ли аргумент массивом вместо объекта (Node.JS)


87

Как мне определить, является ли аргумент массивом, потому что он typeof []возвращает, 'object'а я хочу различать массивы и объекты.

Возможно, этот объект будет выглядеть так, {"0":"string","1":"string","length":"2"}но я не хочу, чтобы он выглядел как массив, если на самом деле это объект, похожий на массив.

JSON.parseи JSON.stringifyумеют это различать. Как я могу это сделать?

Я использую Node.JS, который основан на V8 так же, как и Chrome.

Ответы:


164
  • Array.isArray

родная функция V8. Это быстро, всегда правильно. Это часть ES5.

  • arr instanceof Array

Проверяет, был ли объект создан с помощью конструктора массива.

Метод подчеркивания. Вот отрывок из их источника

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

Этот метод принимает объект и вызывает для него Object.prototype.toStringметод. Это всегда будет возвращаться [object Array]для массивов.

По своему личному опыту я считаю, что запрос toStringметода является наиболее эффективным, но он не такой короткий или читаемый, как instanceof Arrayи не такой быстрый, как Array.isArrayэтот код ES5, и я стараюсь избегать его использования для переносимости.

Я бы лично порекомендовал вам попробовать использовать underscoreэту библиотеку с общими служебными методами. В нем много полезных функций, которые СУХАЮТ ваш код.


1
Использование node.js utilбиблиотека - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
КОФ

5
мягкое напоминание, не требуйте ('util'). isArray (arr) в узле v4.00 и выше. Он устарел
Сунил Хиатани

Почему-то в Node 10.x это выглядит как arr instanceof Arrayсбой. Однако Array.isArray()отлично работает.
Alexis Wilke


8

Как насчет:

your_object instanceof Array

В V8 в Chrome я получаю

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

Похоже, на этот вопрос есть несколько хороших ответов, но для полноты я бы добавил еще один вариант, который ранее не предлагался.

Чтобы проверить, является ли что-то массивом, вы можете использовать utilсобственный модуль Node.js и его isArray()функцию.

Пример:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

Используя этот метод, вам не нужно беспокоиться о стандартах JS, реализованных в V8, поскольку он всегда покажет правильный ответ.


5
FWIW, в util.isArray()настоящее время прокси на Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer

0

Попробуйте так:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.