Приведение типов и операторы
JavaScript — язык со слабой динамической типизацией: когда операции встречаются операнды разных типов, движок молча приводит один к другому, а не бросает ошибку. Это и есть приведение типов (coercion). Оно экономит строчки, но именно из него растут все знаменитые мемы вроде 1 + '2' === '12' и [] == ![].
Приведение работает не в вакууме, а внутри операторов, и у каждого своё правило: + тянет к строке, сравнения — к числу, логические операторы вообще возвращают операнд без приведения. Эта тема разбирает и сами правила приведения, и семейства операторов, которые их применяют. Полная карта — в слоях ниже.
Карта темы
- Обзор операторов — категории (арифметика, сравнение, логика, побитовые), арность, приоритет и ассоциативность, тернарник и запятая.
- Приведение типов — неявное приведение к строке и к числу,
ToPrimitiveи разбор[] == ![]. - Нестрогое против строгого равенства —
==с приведением против===без него,NaNи+0/-0. - Приведение к булеву — восемь falsy-значений, truthy и что делает
!!x. - Логические операторы —
&&,||,??: короткое замыкание и возврат операнда. - Унарные операторы —
typeof,delete,void,!, унарные+/-,++/--. - Побитовые операторы —
&,|,^,~, сдвиги, 32-битное усечение и трюк~~.
Частые ошибки и ловушки
| Ошибка | Последствие | ||||
|---|---|---|---|---|---|
Сравнивать через == вместо === | Тихое приведение — 0 == '', 1 == '1', null == undefined дают true | ||||
Считать, что &&/` | ` возвращают булево | Они возвращают один из операндов, а не true/false | |||
| Путать ` | и ??` для дефолтов | `0 | 5 даёт 5, но 0 ?? 5 даёт 0 — ?? реагирует только на null/undefined` | ||
Забывать, что [] и {} — truthy | Пустой массив истинен, но [] == false — true через приведение | ||||
Ждать от ~~x округления | ~~ усекает к нулю (как Math.trunc), а не округляет | ||||
Полагаться на NaN == NaN | NaN не равен ничему, включая себя; проверяйте Number.isNaN |
Значение для собеседований
Приведение — любимый способ проверить, отличаете ли вы «магию» от механики. Кандидат, который на [] == ![] спокойно проходит шаги ToPrimitive и ToNumber, ценится выше того, кто заучил ответ true, но не может объяснить почему.
Что обычно проверяют:
- Разница
==и===и почему===предпочтителен. - Что возвращают
&&,||,??и как они замыкаются накоротко. - Полный список из восьми falsy-значений.
- Что делают унарные
+,!,typeof,void,delete. - Как побитовые операторы приводят к 32-битному целому.
Типичный неверный ответ: «&& возвращает true или false». На самом деле логические операторы возвращают операнд: 'a' && 'b' — это 'b', а 0 || 'x' — это 'x'. Булево получится, только если операнды уже булевы.