Перевірка, чи масив пустий або не існує. JS

Як найкраще перевірити, чи масив порожній або не існує?

Щось на зразок цього?

if(array.length < 1 || array == undefined){
    //empty
}
Рішення

Спочатку потрібно зробити перевірку на undefined. Якщо зробити навпаки, то буде видаватись помилка, якщо масив не визначений.

if (array === undefined || array.length == 0) {
    // array empty or does not exist
}

Оновлення

Цій відповіді приділяється досить багато уваги, тому я хотів би зазначити, що моя початкова відповідь, перш за все, стосувалася неправильного порядку умов, які оцінюються у запитанні. У цьому сенсі вона не враховує декілька сценаріїв, таких як "нульові" значення, інші типи об'єктів з властивістю "довжина" тощо. Це також не дуже ідіоматичний JavaScript.

**Підхід, що захищає від дурня Надихнувшись коментарями, нижче наведено те, що я вважаю на даний момент надійним способом перевірки того, чи є масив порожнім або не існує. Він також враховує, що змінна може посилатися не на масив, а на якийсь інший тип об'єкта з властивістю length.

if (!Array.isArray(array) || !array.length) {
  // array does not exist, is not an array, or is empty
  // ⇒ do not attempt to process array
}

Розбити на частини:

  1. Array.isArray(), що не дивно, перевіряє, чи є її аргумент масивом. При цьому відсіюються значення типу null, undefined і все інше, що не є масивом.
    Зверніть увагу, що це також усуне масивоподібні об'єкти, такі як об'єкт arguments і об'єкти DOM NodeList. Залежно від вашої ситуації, це може бути не та поведінка, яка вам потрібна.

  2. Умова array.length перевіряє, чи властивість length змінної набуває значення truthy. Оскільки попередня умова вже встановила, що ми дійсно маємо справу з масивом, більш суворі порівняння на кшталт array.length != 0 або array.length !== 0 тут не потрібні.

**Прагматичний підхід У багатьох випадках описане вище може здатися надмірністю. Можливо, ви використовуєте мову вищого порядку, таку як TypeScript, яка виконує більшу частину перевірки типів за вас під час компіляції, або вам дійсно все одно, чи є об'єкт насправді масивом, чи просто схожим на масив.

У цих випадках я схиляюся до наступного, більш ідіоматичного JavaScript:

if (!array || !array.length) {
    // array or array.length are falsy
    // ⇒ do not attempt to process array
}

Або, частіше, його обернений варіант:

if (array && array.length) {
    // array and array.length are truthy
    // ⇒ probably OK to process array
}
Коментарі (9)