Что такое автобоксинг в JavaScript и почему можно обращаться к методам строки через точку
Что проверяют
Знаете ли вы, что происходит в движке при обращении к свойству примитива. Вопрос отделяет тех, кто помнит, что строка не объект, от тех, кто просто пользовался её методами; продолжение обычно про прототипы и про то, почему присваивание свойства примитиву молча теряется.
Как отвечать
Строка, число и булево значение это примитивы, собственных свойств у них нет. Когда вы ставите точку, значение приводится к объекту: создаётся временная обёртка нужного типа, свойство ищется в её прототипе, метод вызывается, результат возвращается, обёртка выбрасывается. Термин автобоксинг пришёл из Java, в спецификации языка это обычное приведение к объекту при доступе к свойству.
const s = "hi";
s.toUpperCase(); // метод найден в String.prototype через временную обёртку
s.foo = 1;
console.log(s.foo); // undefined: обёртка уже уничтоженаДобавьте четыре факта. Обёртки есть у строк, чисел, булевых значений, а также у символов и больших целых. У null и undefined обёрток нет, поэтому точка после них даёт TypeError. Движки чаще всего объект не создают вовсе и идут сразу в прототип, наблюдаемое поведение при этом то же. Внутри метода в строгом режиме this равен примитиву, в нестрогом обёртке.
Где спотыкаются
Говорят, что строка это объект, раз у неё есть методы. Тогда непонятно, почему typeof не показывает объект и почему записанное свойство исчезает; формулировка про временную обёртку снимает оба вопроса.
Создают обёртки явно через new String или new Number. Такой объект ведёт себя иначе: строгое сравнение с примитивом ложно, typeof показывает объект, а обёртка вокруг ложного значения истинна в условии.
Путают приведение к объекту с приведением типов в сравнении. Механизмы разные: первый включается при доступе к свойству, второй при нестрогом равенстве и в арифметике.