Выяснить, является ли переменная пустой, может быть сложно из-за «истинных» и «ложных» результатов JavaScript!
«Пустой сосуд производит самый громкий звук». — Платон
Струны
Начнем со строк. Каково значение пустой строки? Единственный способ узнать это проверить значение.
const isEmptyString = (str) => { if (str === "") return true if (!!!str1.length) return true if (!str1) return true return false } console.log(isEmptyString("")) // true
Любое условие в приведенном выше коде будет работать; однако первое и второе условия могут быть слишком специфичными. Что делать, если значение содержит некоторые пробелы? Лучшее решение будет выглядеть так:
const isEmptyString = (str) => { return !str1.trim() } console.log(isEmptyString("")) // true console.log(isEmptyString(" ")) // true
Массивы
Массивы проще всего проверить на наличие пустых значений. Самая быстрая проверка будет выглядеть так:
const isEmptyArr = (arr) => { return !!!arr.length }
Если «!!!» незнакомо, позвольте мне объяснить. Прежде всего, используя «!!» перед любым выражением в JavaScript заставляет его возвращать истину или ложь (логическое значение) на основе сравнения истинности/ложности JavaScript. Во-вторых, «!» сам по себе является «не» и при таком использовании возвращает противоположный логический результат. Рассмотрим следующие примеры:
const str1 = "foo" const str2 = "" console.log(str1) // foo console.log(!!str1) // true console.log(!!!str1)// false console.log(str2) // <empty string> console.log(!!str2) // false console.log(!!!str2)// true const num1 = 1 const num2 = 0 console.log(num1) // 1 console.log(!!num1) // true console.log(!!!num2)// false console.log(num2) // 0 console.log(!!num2) // false console.log(!!!num2)// true
Объекты
Существует множество способов проверить, является ли объект пустым.
const isEmptyObj = (obj) => { if (obj === {}) return true if (!Object.keys(obj).length) return true for (let i in obj) return false return true }
Я всегда использовал второй пример, пока не прочитал статью компьютерного ученого, который доказал, что последний пример самый быстрый (намного!).
Решение
Окончательное решение — создать служебную функцию, которая обрабатывает все пустые сценарии.
const isEmpty = (val) => { if (Array.isArray(val) { return !!!val.length } if (typeof val === 'object') { for (let i in val) return false return true } if (typeof val === 'string') { return !val.trim() } throw new Error('unknown type') } console.log(isEmpty("")) // true console.log(isEmpty([])) // true console.log(isEmpty({})) // true