Каков наилучший способ проверить, является ли объект массивом или нет в Javascript? - PullRequest
6 голосов
/ 30 июля 2009

Скажем, у меня есть такая функция:

function foo(bar) {
    if (bar > 1) {
       return [1,2,3];
    } else {
       return 1;
    }
}

И сказать, что я звоню foo(1), откуда мне знать, возвращает он массив или нет?

Ответы [ 5 ]

16 голосов
/ 30 июля 2009

Я использую эту функцию:

function isArray(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
}

Это способ реализации jQuery.isArray .

Проверьте эту статью:

3 голосов
/ 30 июля 2009
if(foo(1) instanceof Array)
    // You have an Array
else
    // You don't

Обновление: Я должен ответить на комментарии, сделанные ниже, потому что люди все еще утверждают, что это не сработает, не попробовав это для себя ...

Для некоторых других объектов этот метод не работает (например, "" instanceof String == false), но это работает для Array. Я проверял это в IE6, IE8, FF, Chrome и Safari. Попробуйте и убедитесь сами, прежде чем комментировать ниже.

2 голосов
/ 30 июля 2009

Вот один очень надежный способ, взятый из Javascript: хорошие части, опубликованные О'Рейли:

if (my_value && typeof my_value === 'object' &&  typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! }

Я бы предложил обернуть его в вашу собственную функцию:

function isarray(my_value) {

    if (my_value && typeof my_value === 'object' &&  typeof my_value.length === 'number' &&
        !(my_value.propertyIsEnumerable('length')) 
         { return true; }
    else { return false; }
}
1 голос
/ 15 июня 2017

Начиная с ES5 isArray.

Array.isArray([])  // true
0 голосов
/ 30 июля 2009

Чтобы сделать ваше решение более общим, вам может быть все равно, является ли оно объектом Array. Например, document.getElementsByName () возвращает объект, который «действует как» массив. «Соответствие массиву» можно предположить, если объект имеет свойство «length».

function is_array_compliant(obj){
    return obj && typeof obj.length != 'undefined';
}
...