Javascript 为什么可以';在ECMAScript中,文本不能用作LeftHandside表达式吗?
根据ECMAScript,左侧表达式的定义如下:Javascript 为什么可以';在ECMAScript中,文本不能用作LeftHandside表达式吗?,javascript,ecmascript-6,Javascript,Ecmascript 6,根据ECMAScript,左侧表达式的定义如下: PrimaryExpression[Yield] : this IdentifierReference[?Yield] Literal ... MemberExpression[Yield] : PrimaryExpression[?Yield] ... NewExpression[Yield] : MemberExpression[?Yield] ... LeftHandSi
PrimaryExpression[Yield] :
this
IdentifierReference[?Yield]
Literal
...
MemberExpression[Yield] :
PrimaryExpression[?Yield]
...
NewExpression[Yield] :
MemberExpression[?Yield]
...
LeftHandSideExpression[Yield] :
NewExpression[?Yield]
...
因此,在这种情况下,
文本
应该能够充当左手边表达式
,例如123=456
。但实际上,它不能。有人能解释为什么这不起作用吗?规范定义了一些不属于语法本身的限制。这些被称为“早期错误”。(ES 2019)定义了赋值表达式的早期错误,其中指出:
如果LeftHandSideExpression既不是ObjectLiteral也不是ArrayLiteral,并且LeftHandSideExpression的AssignmentTargetType无效,则这是早期引用错误
如果我们看一下如何在中为PrimaryExpression定义AssignmentTargetType:
这就是为什么。规范定义了一些不属于语法本身的限制。这些被称为“早期错误”。(ES 2019)定义了赋值表达式的早期错误,其中指出: 如果LeftHandSideExpression既不是ObjectLiteral也不是ArrayLiteral,并且LeftHandSideExpression的AssignmentTargetType无效,则这是早期引用错误 如果我们看一下如何在中为PrimaryExpression定义AssignmentTargetType:
这就是为什么。我不是规范阅读方面的专家,但如果使用链替换(我不确定是否使用了正确的术语),我认为
123
不是NewExpression
@Keith。就像你用它的值替换变量一样。我不是规范阅读方面的专家,但如果你使用链替换(我不确定我是否使用了正确的术语),我想它不是123
不是NewExpression
@Keith。就像用变量的值替换变量一样。谢谢你的回答。我也发现了这个规定。我认为这应该是答案,但我不能保证。因为当我尝试123=456
时,提示是SyntaxError:Invalid left-side in assignment
,这与法规中提到的Reference Error
不同。你能解释一下吗?我认为浏览器在报告早期错误方面可能有一定的回旋余地(请参阅),或者可能只是错误地实现了它。如果您查看++
运算符,它也会显示返回引用错误,但123++
会导致语法错误。谢谢您的回答。我也发现了这个规定。我认为这应该是答案,但我不能保证。因为当我尝试123=456
时,提示是SyntaxError:Invalid left-side in assignment
,这与法规中提到的Reference Error
不同。你能解释一下吗?我认为浏览器在报告早期错误方面可能有一定的回旋余地(请参阅),或者可能只是错误地实现了它。如果查看++
操作符,它也会说返回一个引用错误,但是123++
会导致语法错误。
12.2.1.5 Static Semantics: AssignmentTargetType
PrimaryExpression:
this
Literal
...
Return invalid.