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

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

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

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

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

Ответы [ 5 ]

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

62 голосов
/ 09 мая 2011

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

Array.isArray(argument)
7 голосов
/ 17 февраля 2014

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

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

7 голосов
/ 09 мая 2011

Как насчет:

your_object instanceof Array

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

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
0 голосов
/ 27 июня 2017

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

...