什么是JavaScript语法中有效的左侧表达式?

use*_*621 15 javascript grammar ecma262

好的,我们都知道有效的左侧表达式是什么.的种类.*

但是,看看ECMA-Script标准的定义,我很困惑:

LeftHandSideExpression :
    NewExpression
    CallExpression
Run Code Online (Sandbox Code Playgroud)

这只是定义中的错误,还是我在这里弄错了?我的意思是,这实际上并不意味着

new Object = 1; // NewExpression AssignmentOperator PrimaryExpression
function () { return foo; }() = 1;// CallExpression AssignmentOperator PrimaryExpression
Run Code Online (Sandbox Code Playgroud)

应该是有效的赋值表达式?


*从我谦虚的理解,这将更有意义:

LeftHandSideExpression :
    Identifier
    MemberExpression [ Expression ]
    MemberExpression . IdentifierName
    CallExpression [ Expression ]
    CallExpression . IdentifierName
Run Code Online (Sandbox Code Playgroud)

Cha*_*ion 12

为了简明扼要地回答您的问题,LeftHandSideExpression制作中的所有内容都是有效的LeftHandSideExpression.


我认为你真正要问的问题是:

什么是有效的LeftHandSideExpression,也可以分配?

答案就是解决Reference了规范中定义明确的概念的任何问题.在你的例子中

new Object = 1;
Run Code Online (Sandbox Code Playgroud)

new Object是有效的,LeftHandSideExpression但它没有解决到Reference.

(new Object).x = 1;
Run Code Online (Sandbox Code Playgroud)

左侧是MemberExpression . IdentifierName根据规范的最后一步是:

返回类型为Reference的值...


如果你认为它是2个独立的属性,它会更有意义.

  1. 它是一个有效的LeftHandSideExpression吗?
  2. 这是一个有效的参考?

属性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";
Run Code Online (Sandbox Code Playgroud)

这是一个NewExpression重要的案例