Что возвращает typeof для массива в JavaScript
Что проверяют
Знаете ли вы, что typeof различает только примитивы и функцию, и умеете ли корректно проверять тип во время выполнения. Вопрос копеечный, но по нему видно, разбирались ли вы в типах или заучили список ответов.
Как отвечать
typeof [] возвращает строку "object". Массив в JavaScript это объект: у него числовые ключи, прототип Array.prototype и особое поведение length, отдельного примитивного типа для него нет.
typeof []; // "object"
typeof {}; // "object"
typeof null; // "object"
typeof function () {}; // "function"
Array.isArray([]); // trueДля проверки на массив есть Array.isArray. Он честно работает и с массивом из другого окна или фрейма, где instanceof Array уже врёт, потому что конструктор там свой. Запасной вариант: Object.prototype.toString.call(value), который для массива даёт строку с object Array.
Сильный ответ объясняет, почему typeof устроен так. Он возвращает одну из фиксированных строк: undefined, boolean, number, bigint, string, symbol, function и object. Всё, что не примитив и не вызываемое, попадает в object, поэтому массив, дата, регулярное выражение и null через typeof неразличимы.
Где спотыкаются
Проверяют массив через instanceof Array и получают false на данных, пришедших из фрейма или из воркера. Это редкий, но очень неприятный баг, Array.isArray от него избавляет.
Второе: считают массивом всё, у чего есть length. Строка, arguments, коллекция узлов DOM тоже имеют длину, но массивом не являются, и map у них нет.
Третье: тянут отсюда вывод, что typeof бесполезен. Он как раз незаменим там, где переменная может быть не объявлена: typeof maybeGlobal === "undefined" не бросает ReferenceError, в отличие от прямого обращения.