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

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

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

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

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

Ответ 1

  • 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, который представляет собой библиотеку с общими утилитами в ней. У него много полезных функций, которые DRY делают ваш код.

Ответ 2

Попробуйте этот код:

Array.isArray(argument)

Ответ 3

Как насчет:

your_object instanceof Array

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

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

Ответ 4

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

Чтобы проверить, является ли что-то массив, вы можете использовать собственный Node.js util и его функцию 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

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