Skip to main content

Перевірка на масив

Щоб перевірити, чи є значення масивом, використовують 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 Arraytrue / 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'.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.