Интервью-вопрос
Чему будет равно !1
Короткий ответ: !1 вернет false. На интервью важно объяснить два шага: приведение 1 к true и инверсию результата оператором !.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 60 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
Ответ короткий: !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
Путать инверсию и приведение
!не просто делает boolean. Он еще меняет смысл на противоположный. Для1сначала получаетсяtrue, затем результат становитсяfalse. Если вам нужен boolean без инверсии, используйтеBoolean(value)или!!value. - 2
Считать if (!value) проверкой на отсутствие
Такая проверка ловит0, пустую строку,falseиNaN. В форме это может показать ошибку там, где пользователь ввел валидный0. Если нужно проверить только отсутствие, чаще подходитvalue == null. - 3
Думать, что пустые объекты falsy
{}и[]являются truthy, поэтому!{}и![]даютfalse. Если нужно проверить пустой массив, проверяйтеarray.length === 0. Для объекта проверяйте количество ключей или доменное условие. - 4
Писать условия с неочевидным приоритетом
Выражение!value === falseчитается плохо и часто означает не то, что хотел автор. Сначала выполнится!value, потом сравнение сfalse. Лучше написать прямое условие, напримерBoolean(value) === trueили простоif (value), если truthy-проверка действительно подходит. - 5
Смешивать loading, empty и валидный 0
Проверка!countможет показать empty state, хотя данные уже загружены и значение0корректно. В UI лучше хранить отдельные признаки:isLoading,error, наличие ответа и само значение.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание truthy, falsy и логического НЕ в JavaScript.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Благодаря чему JS кроссплатформенный 😎
JavaScript кроссплатформенный из-за стандарта ECMAScript, движков и сред выполнения, которые скрывают различия ОС. На странице разбираем, где это работает надежно, а где начинаются ограничения браузерных и платформенных API.
Что будет при использовании forEach для объекта 😎
У обычного объекта нет метода forEach, поэтому прямой вызов приведет к TypeError. Разбираем, как безопасно перебирать свойства объекта и где легко ошибиться во frontend-коде.