Сова летит символ на кофейной гуще

Внимание! Статья написана для начинающих и тех, кто всё ещё путается в «птичках», «кавычках» и прочих «кофейных зёрнах» языка. Если вы когда-нибудь ловили себя на мысли «почему !!user так важен?», добро пожаловать, вы по адресу.


Глава 1. «Сова» — что это за символ?

На первый взгляд «сова» — это всего лишь два восклицательных знака подряд: !!.
Однако в JavaScript она превращается в мощный инструмент явного приведения к булеву типу.
Рассмотрим пример:

const age = 0;
console.log(age); // 0
console.log(!age); // true (отрицание)
console.log(!!age); // false (двойное отрицание = явное приведение к false)

Таким образом, «сова» (!!) — это короткая запись для Boolean(value).
Она не сравнивает, а кастует, то есть приводит любое значение к true или false.

Глава 2. «Кофейная гуща» — рыхлая и строгая проверка

Рыхлая проверка ==

Оператор == часто сравнивают с гущей в дне чашки: мутная, не всегда очевидна, что именно лежит внизу.
Пример:

console.log('42' == 42); // true — строка приводится к числу
console.log(false == 0); // true, булево приводится к 0

Строгая проверка ===

Оператор === — это уже кристально чистый кофе без сахара и примесей:
значения сравниваются без неявного приведения типов.

console.log('42' === 42); // false, разные типы
console.log(false === 0); // false, разные типы

Совет JSLint (см. заметки от 11 декабря 2008 г.) прямо рекомендует:
заменяйте == на ===, если не нужны именно приведения.

Глава 3. «Летит» — операторы условий и короткое замыкание

В JavaScript логические операторы && и || «летают» по выражениям,
останавливаясь на первом «правдивом» или «ложном» значении. Это называется short-circuit evaluation.

  • && вернёт последнее выражение, если все предыдущие истинны.
  • || вернёт первое истинное значение или последнее, если все ложны.
const config = userConfig || defaultConfig; // если userConfig falsy, берётся defaultConfig

Глава 4. Новые «птички» в небе — нулевое слияние ??

С 2020 года в стандарт языка вошёл ??, nullish coalescing operator.
Он похож на ||, но «летают» он и «сова» работают по-разному:

  • || пропускает любое falsy-значение (0, '', false).
  • ?? пропускает только null и undefined.
const speed = 0 ?? 60; // 0 — потому что 0 не null/undefined
const name = '' ?? 'Guest'; // '', пустая строка тоже не пропускается

Глава 5. Таблица «птичек» на память

Символ Название Что делает
!!value Двойное НЕ Приводит к Boolean
== Рыхлое равенство Сравнение с приведением
=== Строгое равенство Сравнение без приведения
&& Логическое И Возвращает первое falsy или последнее truthy
|| Логическое ИЛИ Возвращает первое truthy или последнее
?? Nullish coalescing Возвращает правый операнд при null/undefined

Глава 6. Практический «кофейный» пример

Представьте, что у нас есть объект пользователя user, и мы хотим вывести его возраст, но с защитой от null/undefined и без ложных тревог на 0:

function getUserAge(user) {
 // до 2020 года писали так:
 const age = (user && user.age !== null && user.age !== undefined)
 ? user.age
 : 18;

 // сейчас достаточно:
 const age = user?.age ?? 18;

 return age;
}

Здесь ?. — это опциональная цепочка, а ?? — «сова» нового времени.
Код стал короче и безопаснее.

Как в хорошем кофе, важно знать пропорции: где нужна строгая проверка, а где достаточно рыхлой; когда «сова» поможет быстро привести к булеву типу, а когда лучше воспользоваться ?? или ||.
Помните: символы, это не магия, а всего лишь инструменты. И чем точнее вы их используете, тем ароматнее получается ваш код.



Дата последнего обновления:
Если заметите новых «птичек» в JS-небе — пишите, разберёмся вместе!