Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Краткий ответ
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]]), что делает его:
- Надежным — работает одинаково во всех контекстах выполнения
- Быстрым — движки JavaScript оптимизируют эту проверку
- Стандартизированным — частью спецификации 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()?
Рекомендуемые сценарии:
-
В функциях, принимающих разные типы аргументов
function sum(items) { if (!Array.isArray(items)) { throw new TypeError('Ожидается массив'); } return items.reduce((acc, val) => acc + val, 0); } -
При работе с API, которые могут возвращать разные структуры данных
fetch('/api/data') .then(response => response.json()) .then(data => { if (Array.isArray(data)) { // Обработка массива } else { // Обработка одиночного объекта } }); -
Для проверки перед использованием методов массива
function safeSort(data) { return Array.isArray(data) ? [...data].sort() : data; }
Производительность и совместимость
- Совместимость: Поддерживается во всех современных браузерах и Node.js (с версии 0.10.0)
- Производительность:
Array.isArray()обычно быстрее, чем полифилл на основеtoString.call()
Заключение
Array.isArray() — это стандартный, надежный и рекомендуемый способ проверки, является ли значение массивом в JavaScript. Он решает исторические проблемы кросс-контекстных проверок, предоставляет однозначный результат и является частью современной спецификации языка. При разработке всегда предпочитайте этот метод устаревшим подходам с instanceof или проверкой конструктора.