Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Перевірка на масив». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Надійний спосіб один: `Array.isArray(value)`.** Це стандартний метод ES5, створений саме для цієї перевірки: він повертає `true` тільки для справжніх масивів і, на відміну від `instanceof Array`, коректно працює зі значеннями з іншого контексту (iframe або окремого вікна). `typeof` тут не допоможе: для масиву він повертає `'object'`. ```javascript Array.isArray([1, 2, 3]); // true Array.isArray('text'); // false Array.isArray({ 0: 'a', 1: 'b', length: 2 }); // false Array.isArray(null); // false ``` **Ключове:** беріть `Array.isArray()`; `instanceof Array` ламається між контекстами, а `Object.prototype.toString.call(value) === '[object Array]'`, це громіздкий запасний варіант.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Щоб перевірити, чи є значення масивом, використовують `Array.isArray(value)`.** Окрема функція потрібна тому, що масив у JavaScript, це різновид об'єкта, і `typeof []` повертає `'object'`, тобто нічого не розрізняє. ## Теорія ### TL;DR - `Array.isArray(value)`, це сучасний і надійний спосіб, стандарт ES5. - Він працює навіть тоді, коли масив створено в іншому контексті (iframe, окреме вікно). - `value instanceof Array` читається зрозуміло, але дає `false` для масиву з чужого контексту. - `Object.prototype.toString.call(value) === '[object Array]'`, це старий запасний спосіб. - `typeof` для цієї задачі не підходить: для масиву він повертає `'object'`. - Схожий на масив об'єкт (`{ length: 2 }`) не є масивом, і жодна з перевірок не скаже інакше. ### Швидкий приклад ```javascript console.log(Array.isArray([1, 2, 3])); // true console.log(Array.isArray('hello')); // false console.log(Array.isArray({ length: 0 })); // false console.log(Array.isArray(new Array())); // true console.log(Array.isArray(null)); // false ``` ### Спосіб 1: `Array.isArray()` ```javascript Array.isArray(value); ``` Це стандартний метод ES5, створений спеціально для цієї перевірки. Він повертає `true`, якщо значення є масивом, і `false` в усіх інших випадках. ```javascript Array.isArray([1, 2, 3]); // true Array.isArray([]); // true Array.isArray('text'); // false Array.isArray({ 0: 'a', 1: 'b', length: 2 }); // false Array.isArray(null); // false ``` Метод працює коректно навіть між різними контекстами виконання (iframe, окреме вікно тощо), бо перевіряє внутрішній слот значення, а не його прототип. Саме це робить його єдиним повністю надійним способом. ### Спосіб 2: `instanceof Array` ```javascript value instanceof Array; ``` Приклад: ```javascript console.log([1, 2, 3] instanceof Array); // true console.log({} instanceof Array); // false ``` Недолік: якщо масив створено в іншому вікні або в iframe, перевірка дасть `false`, бо в того масиву інший конструктор `Array`: ```javascript // у кожного контексту свій глобальний Array iframe.contentWindow.Array !== window.Array; ``` `instanceof` іде прототипним ланцюжком, а прототипи з різних контекстів, це різні об'єкти. Додатково перевірку можна обдурити, підмінивши прототип об'єкта. ### Спосіб 3: `Object.prototype.toString` ```javascript Object.prototype.toString.call(value) === '[object Array]'; ``` Приклад: ```javascript console.log(Object.prototype.toString.call([1, 2, 3])); // "[object Array]" console.log(Object.prototype.toString.call({})); // "[object Object]" ``` Працює коректно, зокрема й між контекстами, але виглядає громіздко, тому зараз майже завжди замінюється на `Array.isArray()`. Історично це був основний спосіб до появи ES5, і його досі можна зустріти в поліфілах. ### Порівняння способів | Метод | Повертає | Плюси | Мінуси | | --- | --- | --- | --- | | `Array.isArray()` | `true` / `false` | Сучасний, надійний, читабельний | Немає | | `instanceof Array` | `true` / `false` | Зрозумілий синтаксис | Не працює між різними контекстами | | `Object.prototype.toString.call()` | `"[object Array]"` | Працює завжди | Складний запис | ### Типові помилки - **Перевіряти через `typeof`.** `typeof []` дає `'object'`, так само як і для `{}` та `null`, тому розрізнити нічим. - **Покладатися на наявність `length`.** У рядка і в `arguments` теж є `length`, але масивами вони не є. - **Використовувати `instanceof` для даних з iframe або з іншого вікна.** Там інший глобальний `Array`, і перевірка мовчки поверне `false`. - **Плутати «схожий на масив» і «масив».** `arguments` і `NodeList`, це array-like колекції: перебирати їх можна, але методів масиву в них немає. Перетворити їх дозволяє `Array.from()`. - **Забувати, що `null`, це теж `'object'`.** Перевірку на масив не можна замінити перевіркою `typeof value === 'object'`.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.