Чтобы кратко ответить на ваш вопрос, все, что ниже LeftHandSideExpression
, является действительным LeftHandSideExpression
.
Я думаю, что вы действительно задаете вопрос:
Что такое действительный LeftHandSideExpression
и также назначаемый?
Ответом на это является все, что разрешается до Reference
, который является четко определенной концепцией в спецификации. В вашем примере
new Object = 1;
new Object
является действительным LeftHandSideExpression
, но не разрешается до Reference
.
(new Object).x = 1;
Левая сторона - это MemberExpression . IdentifierName
, который согласно спецификации, последний шаг:
Возвращает значение типа Reference ...
Если вы считаете, что это 2 отдельных свойства, то это имеет больше смысла.
- Это действительное выражение LeftHandSideExpression?
- Это действительная ссылка?
Свойство 1 определяется на этапе синтаксического анализа, а свойство 2 определяется на этапе семантического анализа. Проверьте 8.7.2 PutValue (V, W) для получения более подробной информации.
Вот полное объяснение в самой спецификации:
8.7 Тип эталонной спецификации
Тип Reference используется для объяснения поведения таких операторов, как delete, typeof и операторы присваивания. Например, ожидается, что левый операнд присваивания создаст ссылку. Вместо этого поведение присваивания может быть полностью объяснено в терминах анализа случая синтаксической формы левого операнда оператора присваивания, но для одной трудности: вызовам функций разрешено возвращать ссылки. Эта возможность допускается исключительно ради хост-объектов. Никакая встроенная функция ECMAScript, определенная в этой спецификации, не возвращает ссылку, и нет никакой возможности для пользовательской функции возвращать ссылку. (Другая причина не использовать синтаксический анализ случаев - это то, что он будет длинным и неудобным, затрагивая многие части спецификации.)
Взглянув на ваше предложение, я считаю, что оно отбросит некоторые правильные выражения (Примечание: я не оправдываю это.)
function OuterObj() {
this.Name = "Outer";
this.InnerObj = function() {
this.Name = "Inner";
}
}
var obj; (obj = new new OuterObj().InnerObj).Name = "Assigned";
Это тот случай, когда NewExpression
важен