21

Как проверить, является ли переменная массивом в JavaScript?

36

Как проверить, является ли переменная массивом в JavaScript?

if (variable.constructor == Array)

Я использую этот код, но не уверен, является ли это наилучшим подходом. Есть ли более надежные или распространенные способы проверки типа переменной в JavaScript? Буду благодарен за ваши советы.

2 ответ(ов)

11

Вы также можете использовать следующий код:

if (value instanceof Array) {
  alert('value является массивом!');
} else {
  alert('Не массив');
}

На мой взгляд, это довольно элегантное решение, но каждому своё.

Правка:

С версии ES5 также доступен метод:

Array.isArray(value);

Однако этот метод может не работать в старых браузерах, если вы не используете полифилы (в основном это касается IE8 и подобных).

0

Лично мне нравится предложение Питера: ссылка на ответ (для ECMAScript 3. Для ECMAScript 5 используйте Array.isArray()).

Однако в комментариях к посту указывается, что если toString() как-либо изменится, такой способ проверки массива перестанет работать. Если вы хотите быть более конкретным и убедиться, что toString() не изменен, а также что атрибут класса объекта ( [object Array] — это атрибут класса объекта, который является массивом) не вызывает проблем, я рекомендую сделать что-то вроде этого:

// Проверяет, возвращает ли toString правильные атрибуты класса объектов, которые являются массивами
// возвращает -1, если тест не пройден
// возвращает true, если тест пройден и это массив
// возвращает false, если тест пройден и это не массив
function is_array(o) {
    // Убедимся, что массив имеет атрибут класса [object Array]
    var check_class = Object.prototype.toString.call([]);
    if (check_class === '[object Array]') {
        // Тест пройден, теперь проверим
        return Object.prototype.toString.call(o) === '[object Array]';
    } else {
        // Возможно, стоит изменить возвращаемое значение на что-то более желаемое
        return -1; 
    }
}

Обратите внимание, что в книге "JavaScript: The Definitive Guide" (6-е издание, 7.10) говорится, что Array.isArray() реализован с использованием Object.prototype.toString.call() в ECMAScript 5. Также стоит отметить, что если вас беспокоит изменение реализации toString(), следует беспокоиться и о каждом другом встроенном методе. Почему использовать push()? Кто-то может его изменить! Такой подход выглядит абсурдным. Вышеуказанная проверка предложена тем, кто озабочен изменением toString(), но я считаю, что такая проверка не нужна.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь