Выяснить, является ли переменная пустой, может быть сложно из-за «истинных» и «ложных» результатов 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