Истинность: null, undefined и truthy

Урок разбирает матчеры для проверки null, undefined и «правдивости» значений.

В JavaScript разные «пустые» значения ведут себя по-разному, и Jest даёт отдельные матчеры под каждый случай.

Зачем отдельные матчеры

Иногда нас интересует не точное значение, а его «характер»: пустое оно или нет, определено или нет. Для этого есть специальные матчеры — они делают тест выразительнее, чем toBe(null).

Основные матчеры истинности

МатчерПроходит, когда значение...
toBeNull()строго null
toBeUndefined()строго undefined
toBeDefined()НЕ undefined
toBeTruthy()истинно в булевом контексте
toBeFalsy()ложно в булевом контексте

Truthy и falsy

В JavaScript «ложными» (falsy) считаются: false, 0, '' (пустая строка), null, undefined и NaN. Всё остальное — «истинно» (truthy). Освежим это живым примером:

const values = [0, '', 'текст', null, undefined, 42, [], NaN];

for (const v of values) {
  console.log(JSON.stringify(v), '\u2192', Boolean(v) ? 'truthy' : 'falsy');
}

Вывод:

0 → falsy
"" → falsy
"текст" → truthy
null → falsy
undefined → falsy
42 → truthy
[] → truthy
null → falsy

Обратите внимание: пустой массив [] — truthy, а NaN сериализуется JSON как null (поэтому в выводе видно null), но сам по себе он falsy.

Применение в тестах

expect(findUser(999)).toBeNull();           // не нашли — вернули null
expect(user.email).toBeDefined();           // поле точно есть
expect(getCache('miss')).toBeUndefined();   // в кэше пусто
expect(isValid('correct')).toBeTruthy();    // любая истинность
expect(items.length === 0).toBeFalsy();     // массив не пуст

toBeTruthy против toBe(true)

Это не одно и то же. toBe(true) требует именно булево true. toBeTruthy() примет любое истинное значение — строку, число, объект. Если функция должна возвращать строго true, проверяйте toBe(true); если важна лишь «правдивость» — toBeTruthy().

Итог

  • toBeNull, toBeUndefined, toBeDefined — точные проверки пустых значений.
  • toBeTruthy/toBeFalsy проверяют истинность в булевом контексте.
  • Falsy-значения: false, 0, '', null, undefined, NaN.
  • toBe(true) строже, чем toBeTruthy().
Проверьте себя
1. Какой матчер проверяет, что значение НЕ равно undefined?
AtoBeUndefined()
BtoBeDefined()
CtoBeNull()
DtoBeFalsy()
2. Какое из значений является truthy?
A0
BПустая строка ''
CПустой массив []
Dnull
3. Чем toBeTruthy() отличается от toBe(true)?
AНичем
BtoBeTruthy() примет любое истинное значение, а toBe(true) — только булево true
CtoBe(true) принимает любое truthy
DtoBeTruthy() работает только с числами
Поддержать проект