Спецификация для оператора in
объясняет это. В частности, см. Шаг 5 семантической оценки.
11.8.7 Оператор in
Производство RelationalExpression: RelationalExpression в ShiftExpression оценивается следующим образом:
- Пусть lref будет результатом вычисления RelationalExpression.
- Пусть lval будет GetValue (lref).
- Пусть rref будет результатом вычисления ShiftExpression.
- Пусть rval будет GetValue (rref).
- Если тип (rval) не является объектом, выдается исключение TypeError .
- Возвращает результат вызова внутреннего метода [[HasProperty]] для rval с аргументом ToString (lval).
Причина, по которой работает (3).constructor
, немного сложнее понять, но по существу, когда вы используете оператор точки на ссылке с примитивной базой, она поднимается в объект.