Ответ вслух Junior Типы и приведение спрашивают часто обновлено

Неявное приведение типов в JavaScript

Вопрос

Объясните, как работает неявное приведение типов в JavaScript. Приведите примеры, где оно приводит к ошибкам.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «В JS операторы сами приводят значения к нужному типу. Видов приведения три: к строке, к числу и к булеву.

Что должно прозвучать в ответе

  • Приведение бывает к строке, к числу и к булеву, операторы делают его сами

  • Бинарный `+` склеивает строки, если хотя бы один операнд строка; остальные арифметические операторы приводят к числу

  • Объекты сначала превращаются в примитив через `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 ошибок.

Термины по теме