Неявное приведение типов в JavaScript
Вопрос
Объясните, как работает неявное приведение типов в JavaScript. Приведите примеры, где оно приводит к ошибкам.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Приведение бывает к строке, к числу и к булеву, операторы делают его сами
Бинарный `+` склеивает строки, если хотя бы один операнд строка; остальные арифметические операторы приводят к числу
Объекты сначала превращаются в примитив через `Symbol.toPrimitive`, `valueOf` или `toString`
`==` приводит типы по своим правилам, `===` нет; `null == undefined` и больше ни с чем
Пример бага: значения из input это строки, `'2' + '3'` даёт `'23'`
В рабочем коде: `===` и явное приведение через `Number()`, `String()`, `Boolean()`
Что могут спросить следом
- Почему
[] + {}даёт строку'[object Object]'? - Когда
==в коде допустимо? - Как привести строку
'12px'к числу 12?
Разбор
Образцовый ответ: «В JS операторы сами приводят значения к нужному типу. Видов приведения три: к строке, к числу и к булеву. Бинарный плюс особенный: если после приведения к примитиву один из операндов строка, он склеивает строки, поэтому 1 + '2' это '12'. Минус, умножение и деление всегда приводят к числу: '5' - 2 это 3. Объект сначала становится примитивом: вызывается Symbol.toPrimitive, если его нет, то valueOf и toString; у массива toString склеивает элементы через запятую, поэтому [] + 1 даёт '1'. В условиях всё приводится к булеву, ложных значений восемь, остальное истинно, даже [] и '0'. Нестрогое равенство тоже приводит: строка к числу, булево к числу, а null равен только undefined. Типичный баг: значения из полей формы это строки, и сложение превращается в конкатенацию. Поэтому в коде я использую === и привожу явно через Number(); единственное ==, которое оставляю, это x == null».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.