JavaScript: определить, является ли аргумент массивом вместо объекта (Node.JS)
Как определить, является ли аргумент массивом, потому что typeof []
возвращает 'object'
, и я хочу различать массивы и объекты.
Возможно, что объект будет выглядеть как {"0":"string","1":"string","length":"2"}
, но я не хочу, чтобы он выходил как массив, если он фактически является объектом, похожим на массив.
JSON.parse
и JSON.stringify
могут сделать это различие. Как я могу это сделать?
Я использую Node.JS, который основан на V8 так же, как Chrome.
Ответы
Ответ 1
встроенная функция V8. Это быстро, это всегда правильно. Это часть ES5.
Проверяет, был ли объект создан с помощью конструктора массива.
Метод из подчеркивания. Вот фрагмент, взятый из их источника
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())