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

Как узнать что в переменной находится массив?

2.0 Middle🔥 151 комментариев
#JavaScript Core

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

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

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

Методы проверки переменной на принадлежность к типу "массив" в JavaScript

В JavaScript существует несколько надежных способов определить, содержит ли переменная массив. Каждый подход имеет свои особенности, которые важно учитывать в зависимости от контекста использования.

1. Array.isArray() - современный стандартный метод

Наиболее надежный и рекомендуемый способ - использование встроенного метода Array.isArray(). Этот метод был добавлен в спецификацию ECMAScript 5 и поддерживается всеми современными браузерами.

const arr = [1, 2, 3];
const obj = {0: 1, 1: 2, 2: 3, length: 3};
const str = "test";

console.log(Array.isArray(arr));  // true
console.log(Array.isArray(obj));  // false
console.log(Array.isArray(str));  // false
console.log(Array.isArray(null)); // false

Преимущества:

  • Работает корректно с массивами из разных контекстов выполнения (iframe, worker)
  • Надежно отличает массивы от объектов с числовыми ключами
  • Часть стандарта языка, гарантированная поддержка

2. Проверка через instanceof

До появления Array.isArray() часто использовали оператор instanceof:

const arr = [];
const fakeArray = {__proto__: Array.prototype};

console.log(arr instanceof Array);          // true
console.log(fakeArray instanceof Array);    // true (ложное срабатывание!)

Недостатки:

  • Не работает с массивами из разных фреймов (каждый фрейм имеет свой объект Array)
  • Может быть обманут при манипуляции с цепочкой прототипов
  • Не рекомендуется для production-кода

3. Метод Object.prototype.toString.call()

Универсальный способ проверки типа любых объектов:

const arr = [];
const obj = {};
const fakeArray = {length: 0, splice: function() {}};

console.log(Object.prototype.toString.call(arr));        // "[object Array]"
console.log(Object.prototype.toString.call(obj));        // "[object Object]"
console.log(Object.prototype.toString.call(fakeArray)); // "[object Object]"

// Универсальная функция проверки
function isArray(value) {
    return Object.prototype.toString.call(value) === '[object Array]';
}

Преимущества:

  • Работает с массивами из любого контекста выполнения
  • Надежно определяет тип
  • Может быть адаптирован для проверки других типов

4. Проверка наличия специфических методов массива

Некоторые разработчики проверяют наличие методов, характерных для массивов:

function isArrayLike(value) {
    return value && 
           typeof value === 'object' && 
           'length' in value && 
           typeof value.push === 'function';
}

console.log(isArrayLike([]));                     // true
console.log(isArrayLike({length: 0}));           // false (нет push)
console.log(isArrayLike(document.querySelectorAll('div'))); // false

Важно: Этот метод ненадежен, так как объекты могут имитировать методы массива.

5. Проверка конструктора

const arr = [];

console.log(arr.constructor === Array);  // true
console.log(arr.constructor.name === 'Array'); // true

Проблемы:

  • Конструктор может быть переопределен: arr.constructor = Object
  • Не работает с null и undefined
  • Тот же недостаток с контекстами выполнения, что и у instanceof

Рекомендации и лучшие практики

  1. Всегда используйте Array.isArray() для production-кода
  2. Для поддержки старых браузеров (IE8 и ниже) добавьте полифилл:
if (!Array.isArray) {
    Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === '[object Array]';
    };
}
  1. Помните о различиях между массивами и массивоподобными объектами:
    • NodeList, HTMLCollection, Arguments - имеют length, но не являются массивами
    • Для преобразования используйте Array.from() или [...arrayLike]
// Преобразование массивоподобных объектов
const nodeList = document.querySelectorAll('div');
const realArray1 = Array.from(nodeList);
const realArray2 = [...nodeList];

Заключение: В современном JavaScript единственно правильный способ проверить, является ли переменная массивом - использовать Array.isArray(). Этот метод стандартизирован, оптимизирован движками JavaScript и гарантирует корректную работу во всех сценариях. Альтернативные методы стоит использовать только в специфических случаях или для обратной совместимости со старыми версиями браузеров.