← Назад к вопросам

Что возвращает метод Array.isArray?

1.6 Junior🔥 141 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Краткий ответ

Array.isArray() возвращает true, если переданное значение является массивом, и false — во всех остальных случаях.

console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
console.log(Array.isArray('array')); // false
console.log(Array.isArray(null)); // false

Подробное объяснение

Array.isArray() — это статический метод конструктора Array, предназначенный для надежной проверки, является ли переданный аргумент именно массивом в JavaScript. Это самый надежный и рекомендуемый способ такой проверки в современных приложениях.

Зачем нужен этот метод?

Исторически в JavaScript существовало несколько проблемных способов проверки на массив:

// Ненадежные способы (использовать не рекомендуется)
const arr = [1, 2, 3];
console.log(arr instanceof Array); // true, но может не работать в cross-frame/iframe сценариях
console.log(arr.constructor === Array); // true, но объект может не иметь конструктора

Основные проблемы старых подходов:

  • instanceof не работает надежно при взаимодействии между разными фреймами или контекстами выполнения (iframe, разные realm)
  • constructor свойство может быть изменено или отсутствовать
  • typeof для массива возвращает 'object', что бесполезно для различения массивов и обычных объектов

Как работает Array.isArray()

Метод использует внутреннюю проверку [[Class]] значения (в современных реализациях — внутренний слот [[Array]]), что делает его:

  1. Надежным — работает одинаково во всех контекстах выполнения
  2. Быстрым — движки JavaScript оптимизируют эту проверку
  3. Стандартизированным — частью спецификации ECMAScript 5 (ES5)

Практические примеры использования

Базовые случаи

// Истинные случаи
console.log(Array.isArray([])); // true
console.log(Array.isArray(new Array())); // true
console.log(Array.isArray(Array.prototype)); // true (прототип массива тоже массив!)

// Ложные случаи
console.log(Array.isArray({})); // false
console.log(Array.isArray(123)); // false
console.log(Array.isArray('string')); // false
console.log(Array.isArray(true)); // false
console.log(Array.isArray(undefined)); // false
console.log(Array.isArray(null)); // false
console.log(Array.isArray(function() {})); // false

Пограничные и интересные случаи

// Массивоподобные объекты НЕ являются массивами
console.log(Array.isArray(arguments)); // false
console.log(Array.isArray({ length: 0 })); // false
console.log(Array.isArray(document.querySelectorAll('div'))); // false

// Специальные типизированные массивы
console.log(Array.isArray(new Int8Array())); // false
console.log(Array.isArray(new Float32Array())); // false

// Проверка в условиях
function processInput(input) {
    if (Array.isArray(input)) {
        // Работаем с массивом
        return input.map(item => item * 2);
    } else if (input && typeof input === 'object') {
        // Работаем с объектом
        return { ...input, processed: true };
    }
    return input;
}

Полифиллы для старых браузеров

Для поддержки в устаревших средах (IE < 9) можно использовать полифилл:

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

Этот полифилл использует метод Object.prototype.toString(), который является стандартизированным способом определения внутреннего [[Class]] значения.

Когда использовать Array.isArray()?

Рекомендуемые сценарии:

  1. В функциях, принимающих разные типы аргументов

    function sum(items) {
        if (!Array.isArray(items)) {
            throw new TypeError('Ожидается массив');
        }
        return items.reduce((acc, val) => acc + val, 0);
    }
    
  2. При работе с API, которые могут возвращать разные структуры данных

    fetch('/api/data')
        .then(response => response.json())
        .then(data => {
            if (Array.isArray(data)) {
                // Обработка массива
            } else {
                // Обработка одиночного объекта
            }
        });
    
  3. Для проверки перед использованием методов массива

    function safeSort(data) {
        return Array.isArray(data) ? [...data].sort() : data;
    }
    

Производительность и совместимость

  • Совместимость: Поддерживается во всех современных браузерах и Node.js (с версии 0.10.0)
  • Производительность: Array.isArray() обычно быстрее, чем полифилл на основе toString.call()

Заключение

Array.isArray() — это стандартный, надежный и рекомендуемый способ проверки, является ли значение массивом в JavaScript. Он решает исторические проблемы кросс-контекстных проверок, предоставляет однозначный результат и является частью современной спецификации языка. При разработке всегда предпочитайте этот метод устаревшим подходам с instanceof или проверкой конструктора.