Как надёжно определить тип значения
Вопрос
Как бы вы надёжно определили тип значения: примитив, null, массив, дата, NaN?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`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 ошибок.