Подтвердить что ты не робот

Обнаружение, если переданный параметр является массивом? Javascript

Возможный дубликат:
Как определить, является ли переменная массивом

У меня есть простой вопрос:

Как определить, является ли параметр, переданный моей javascript-функции массивом? Я не верю, что могу проверить:

if (typeof paramThatCouldBeArray == 'array') 

Так возможно?

Как мне это сделать?

Спасибо заранее.

4b9b3361

Ответ 1

if (param instanceof Array)
    ...

Изменить.. С 2016 года существует готовый метод, который улавливает больше угловых случаев, Array.isArray, используется следующим образом:

if (Array.isArray(param))
    ...

Ответ 2

Это подход JQuery 1.4.2 использует:

var toString = param.prototype.toString;
var isArray = function(obj) {
        return toString.call(obj) === "[object Array]";
    }

Ответ 3

Я нашел здесь здесь:

function isArray(obj) {
    return obj.constructor == Array; 
}

тоже этот

function isArray(obj) {
    return (obj.constructor.toString().indexOf("Array") != -1);
}

Ответ 4

Некоторые дни назад Я создавал функцию обнаружения простого типа, возможно, полезную для вас:

Использование:

//...
if (typeString(obj) == 'array') {
  //..
}

Реализация:

function typeString(o) {
  if (typeof o != 'object')
    return typeof o;

  if (o === null)
      return "null";
  //object, array, function, date, regexp, string, number, boolean, error
  var internalClass = Object.prototype.toString.call(o)
                                               .match(/\[object\s(\w+)\]/)[1];
  return internalClass.toLowerCase();
}

второй вариант этой функции более строгий, поскольку он возвращает только типы объектов, описанные в спецификации ECMAScript (возможные выходные значения: "object", "undefined", "null" и "function", "array", "date", "regexp", "string", "number", "boolean" "error", используя [[Class]] внутреннее свойство).

Ответ 5

Вы можете проверить свойство constructor:

if (param.constructor == Array) {
    ...
}

Хотя это будет включать объекты с прототипом массива,

function Stack() {
}
Stack.prototype = [];

если они также не определяют конструктор:

Stack.prototype.constructor = Stack;

или

function Stack() {
    this.constructor = Stack;
}

Ответ 6

Тип утки

На самом деле, вы не обязательно хотите проверить, что объект является массивом. Вы должны тип утки, и единственное, что вы хотите реализовать для этого объекта, - это свойство length. После этого вы можете преобразовать его в массив:

var arrayLike = {
    length : 3,

    0: "foo"
};

// transform object to array
var array = Array.prototype.slice.call(arrayLike);

JSON.stringify(array); // ["foo", null, null]

Array.prototype.slice.call(object) преобразует в массив каждый объект, который предоставляет свойство length. Например, в случае строк:

var array = Array.prototype.slice.call("123");
JSON.stringify(array); // ["1", "2", "3"]

Ну, эта техника не совсем работает на IE6 (я не знаю о более поздних версиях), но легко создать небольшую служебную функцию для преобразования объектов в массивы.