Почему (3) .constructor допустим, в то время как «конструктор» в (3) недействителен? - PullRequest
3 голосов
/ 04 ноября 2010

(3).constructor - это число, но "constructor" in (3) - это ошибка типа, почему?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

При использовании средства доступа к свойству число 3 превращается в объект Число .И объект этого типа имеет конструктор и, таким образом, свойство constructor.

Но , как ChaosPandion уже указал , для оператора in требуется правовыражение для получения объекта, но 3 это не объект, а обычный числовой литерал.

3 голосов
/ 04 ноября 2010

Спецификация для оператора in объясняет это. В частности, см. Шаг 5 семантической оценки.

11.8.7 Оператор in

Производство RelationalExpression: RelationalExpression в ShiftExpression оценивается следующим образом:

  1. Пусть lref будет результатом вычисления RelationalExpression.
  2. Пусть lval будет GetValue (lref).
  3. Пусть rref будет результатом вычисления ShiftExpression.
  4. Пусть rval будет GetValue (rref).
  5. Если тип (rval) не является объектом, выдается исключение TypeError .
  6. Возвращает результат вызова внутреннего метода [[HasProperty]] для rval с аргументом ToString (lval).

Причина, по которой работает (3).constructor, немного сложнее понять, но по существу, когда вы используете оператор точки на ссылке с примитивной базой, она поднимается в объект.

...