Gernar
Frontend DeveloperJavaScript

Интервью-вопрос

Чему будет равно !1

Короткий ответ: !1 вернет false. На интервью важно объяснить два шага: приведение 1 к true и инверсию результата оператором !.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Что ответить, если вас спрашивают, чему равно !1?

Вы хотите дать короткий и точный ответ без лишней лекции.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Ответ короткий: !1 равно false.

Оператор ! в JavaScript работает не как арифметическая операция. Он берет любое значение, приводит его к boolean по правилам truthy и falsy, а потом возвращает противоположный boolean.

Для 1 шаги такие:

Boolean(1); // true
!1; // false

На интервью можно сказать так: число 1 truthy, логическое НЕ инвертирует true, результат будет false.

Что именно проверяют этим вопросом

Вопрос маленький, но он проверяет не запоминание одного примера, а понимание приведения типов. Если вы отвечаете только "false" и останавливаетесь, ответ формально верный, но слабый. Лучше добавить одну фразу про truthy/falsy и одну фразу про инверсию.

Хороший короткий ответ:

!1 вернет false. Сначала 1 приводится к boolean как true, потому что это truthy-значение. Потом оператор ! инвертирует результат.

Этого достаточно для базового вопроса. Дальше можно показать практический нюанс: !value не означает "значение отсутствует". Он означает "значение falsy".

Truthy и falsy в реальном коде

В JavaScript falsy-значений немного: false, 0, -0, 0n, пустая строка, null, undefined и NaN. Все остальные значения truthy.

Поэтому !value может быть удобной короткой проверкой. Но он же может стать источником бага.

function renderPrice(price) {
  // Плохо, если 0 это валидная цена
  if (!price) {
    return "Цена не указана";
  }

  return `${price} ₽`;
}

Если price равен 0, функция вернет "Цена не указана". Это неверно, если нулевая цена допустима. Безопаснее проверить именно отсутствие значения:

function renderPrice(price) {
  if (price == null) {
    return "Цена не указана";
  }

  return `${price} ₽`;
}

Здесь price == null намеренно ловит только null и undefined. Если в вашей команде запрещен ==, можно написать явно: price === null || price === undefined.

!, !! и Boolean

! инвертирует результат, а !! часто используют для явного приведения к boolean без изменения итогового смысла.

!1; // false
!!1; // true
Boolean(1); // true

В условиях if дополнительное !! обычно не нужно. Условие и так оценивает значение по truthy/falsy-правилам.

if (user) {
  // достаточно
}

if (!!user) {
  // работает, но чаще лишний шум
}

Для явного boolean-пропса или значения в состоянии !! может быть уместен, если вы хотите сохранить именно признак наличия.

Объекты, массивы и частая ловушка

Пустой объект и пустой массив являются truthy. Это часто сбивает с толку, потому что в обычной речи пустой звучит как ложный. В JavaScript это не так.

!{}; // false
![]; // false
Boolean({}); // true
Boolean([]); // true

Поэтому нельзя проверять пустоту массива так:

// Плохо: условие не сработает для пустого массива
if (!items) {
  showEmptyState();
}

Если нужно показать пустое состояние для массива, проверяйте длину:

if (items.length === 0) {
  showEmptyState();
}

А если массив может еще не прийти из API, разделяйте состояния: загрузка, ошибка, отсутствие данных и пустой список. Иначе UI начнет путать "данные еще не загружены" и "данные загружены, но список пуст".

React и UI-состояние

Во frontend-коде проблема часто появляется не в выражении !1, а в слишком широкой проверке состояния.

function CartSummary({ items, total }) {
  if (!items) {
    return <Spinner />;
  }

  if (!total) {
    return <p>Корзина пуста</p>;
  }

  return <p>Итого: {total} ₽</p>;
}

Здесь есть два риска. Пустой массив [] не попадет в !items, потому что массив truthy. А total = 0 попадет в !total, хотя нулевая сумма может быть корректной для скидки или бесплатного заказа. В результате пользователь увидит неверный экран.

Безопаснее назвать состояния явно:

function CartSummary({ items, total, isLoading }) {
  if (isLoading) {
    return <Spinner />;
  }

  if (items.length === 0) {
    return <p>Корзина пуста</p>;
  }

  return <p>Итого: {total} ₽</p>;
}

Такая проверка не делает лишних запросов и не чинит race condition сама по себе. Но она убирает частый UI-баг: компонент больше не угадывает состояние по falsy-значению там, где нужен конкретный признак.

Практический вывод для ответа

На интервью лучше не уходить в длинную лекцию. Дайте результат, объясните механизм и сразу покажите, что понимаете риск в коде.

Можно ответить так:

!1 равно false. Оператор ! приводит значение к boolean и инвертирует его. 1 это truthy, значит Boolean(1) будет true, а после инверсии получится false. В коде я аккуратно использую !value, потому что он ловит все falsy-значения, включая 0 и пустую строку.

Такой ответ показывает не только знание результата, но и понимание последствий для frontend-кода.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Путать инверсию и приведение

    ! не просто делает boolean. Он еще меняет смысл на противоположный. Для 1 сначала получается true, затем результат становится false. Если вам нужен boolean без инверсии, используйте Boolean(value) или !!value.
  2. 2

    Считать if (!value) проверкой на отсутствие

    Такая проверка ловит 0, пустую строку, false и NaN. В форме это может показать ошибку там, где пользователь ввел валидный 0. Если нужно проверить только отсутствие, чаще подходит value == null.
  3. 3

    Думать, что пустые объекты falsy

    {} и [] являются truthy, поэтому !{} и ![] дают false. Если нужно проверить пустой массив, проверяйте array.length === 0. Для объекта проверяйте количество ключей или доменное условие.
  4. 4

    Писать условия с неочевидным приоритетом

    Выражение !value === false читается плохо и часто означает не то, что хотел автор. Сначала выполнится !value, потом сравнение с false. Лучше написать прямое условие, например Boolean(value) === true или просто if (value), если truthy-проверка действительно подходит.
  5. 5

    Смешивать loading, empty и валидный 0

    Проверка !count может показать empty state, хотя данные уже загружены и значение 0 корректно. В UI лучше хранить отдельные признаки: isLoading, error, наличие ответа и само значение.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание truthy, falsy и логического НЕ в JavaScript.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание