if (param instanceof Array)
...
Править. По состоянию на 2016 год существует готовый метод, который улавливает больше угловых случаев, Array.isArray
, используемый следующим образом:
if (Array.isArray(param))
...
Я нашел это здесь :
function isArray(obj) {
return obj.constructor == Array;
}
также этот
function isArray(obj) {
return (obj.constructor.toString().indexOf(”Array”) != -1);
}
Вы можете протестировать свойство конструктора :
if (param.constructor == Array) {
...
}
Хотя это будет включать объекты, которые имеют прототип массива,
function Stack() {
}
Stack.prototype = [];
, если они также не определяют конструктор:
Stack.prototype.constructor = Stack;
или:
function Stack() {
this.constructor = Stack;
}
На самом деле, вам не обязательно проверять, является ли объект массивом. Вы должны набрать его, и единственное, что вы хотите, чтобы этот объект реализовал, - это свойство 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 (я не знаю о более поздних версиях), но легко создать небольшую служебную функцию для преобразования объектов в массивах.
Это подход, который использует jQuery 1.4.2:
var toString = param.prototype.toString;
var isArray = function(obj) {
return toString.call(obj) === "[object Array]";
}
Несколько дней назад я создавал простую функцию определения типов, возможно, она вам пригодится:
Использование:
//...
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]]
внутреннее свойство).