Какие данные остаются после преобразования типов в JavaScript и когда оно происходит
Что проверяют
Знаете ли вы правила приведения, а не набор мемов вроде [] + {}. Интервьюер хочет услышать, к каким типам вообще приводится значение и какие операторы запускают приведение. Следом обычно дают пару выражений и просят предсказать результат.
Как отвечать
Начните с главного: приведение всегда даёт новое примитивное значение одного из трёх типов: строку, число или логическое значение. Исходная переменная не меняется. Объект сначала превращается в примитив через ToPrimitive: вызывается Symbol.toPrimitive, если он есть, иначе valueOf() и toString() в порядке, зависящем от подсказки.
Когда приведение происходит неявно:
- бинарный
+: если хотя бы один операнд послеToPrimitiveстрока, это склейка:"5" + 2даёт"52". Остальные арифметические операторы приводят к числу:"5" - 2даёт3; - нестрогое сравнение
==:null == undefinedистинно, ноnull == 0ложно, строка и логическое значение приводятся к числу; - сравнения
<и>: две строки сравниваются посимвольно, иначе всё идёт к числу, поэтомуnull >= 0истинно; - логический контекст (
if,!,&&,||): ложные значения этоfalse,0,-0,0n,"",null,undefined,NaN. Всё остальное истинно, включая[],{}и"0"; - шаблонные строки: значение приводится к строке.
К числу стоит помнить результаты: Number("") и Number(null) дают 0, Number(undefined) даёт NaN, Number("12px") тоже NaN, а parseInt("12px") вернёт 12. Смешивать BigInt с обычным числом нельзя, 1n + 1 бросает TypeError, как и неявное приведение Symbol к строке.
Явное приведение: String(), Number(), Boolean(), унарный +. На практике безопаснее сравнивать через ===, а NaN проверять через Number.isNaN().
Где спотыкаются
Считают, что + всегда складывает числа. На данных из формы это даёт "10" + 5 === "105".
Думают, что пустой массив ложен. if ([]) выполнится, а вот [] == false истинно: массив сначала становится пустой строкой, потом нулём.
Путают null и undefined при переводе в число: первое даёт 0, второе NaN, отсюда null + 1 === 1, а undefined + 1 это NaN.