Когда вы используете оператор .
с примитивом, язык автоматически устанавливает его в соответствующий тип объекта (в данном случае - Number). Это потому, что простые примитивные типы в JavaScript действительно не являются экземплярами объекта.
Таким образом, фактическая левая сторона
a.__proto__
не число 12
, но по существу new Number(12)
. Однако переменная «a» продолжает оставаться простым значением 12
.
— Section 8.7 of the spec «объясняет» это типичным языком языка ECMA 262. Я не могу найти четкий абзац, в котором описывается, как примитив baseValue рассматривается как экземпляр Number, Boolean или String, но этот раздел непосредственно подразумевает его. Я думаю, что потому, что эти не примитивные синтетические значения являются эфемерными (они только «реальные», в то время как вычисляется выражение .
или []
), что спецификация просто говорит о поведении, не требуя явного требования о создании фактического числа. Однако я догадываюсь об этом.
Вы были бы еще добрее и, возможно, дали бы ссылку на спецификации ECMA для этого преобразования? –
@ ashy_32bit обязательно - я обновлю ответ – Pointy
Я буду голосовать как стимулятор;) –