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