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

Как надёжно определить тип значения

Вопрос

Как бы вы надёжно определили тип значения: примитив, null, массив, дата, NaN?

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

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

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

Коротко

Образцовый ответ: «Начинаю с typeof: он надёжен для undefined, boolean, number, bigint, string, symbol и функций. У него две ловушки: typeof null это 'object' из-за исторической ошибки, и массивы тоже 'object'.

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

  • `typeof` подходит для примитивов и функций, но для null и массивов даёт `'object'`

  • null проверяется через `=== null`

  • Массив проверяется через `Array.isArray`, он работает и между iframe, в отличие от `instanceof Array`

  • NaN проверяется через `Number.isNaN`, а не глобальный `isNaN`

  • Для встроенных объектов есть `Object.prototype.toString.call(x)`, дающий `[object Date]` и подобное

  • `instanceof` проверяет цепочку прототипов, а не «тип»

Что могут спросить следом

  • Почему instanceof Array может ошибиться?
  • Как проверить, что значение это простой объект {}, а не экземпляр класса?
  • Чем Number.isNaN отличается от isNaN?

Разбор

Образцовый ответ: «Начинаю с typeof: он надёжен для undefined, boolean, number, bigint, string, symbol и функций. У него две ловушки: typeof null это 'object' из-за исторической ошибки, и массивы тоже 'object'. Поэтому null проверяю строгим сравнением с null, массивы через Array.isArray. Он лучше, чем instanceof Array, потому что массив из другого iframe создан другим конструктором Array, и instanceof вернёт false. NaN проверяю через Number.isNaN: глобальный isNaN сначала приводит к числу и считает NaN любую нечисловую строку. Для дат, регулярок и прочих встроенных объектов можно использовать Object.prototype.toString.call(value), он вернёт [object Date]. А простой объект отличаю от экземпляра класса проверкой прототипа: Object.getPrototypeOf(x) === Object.prototype или null».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

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