首页 > 解决方案 > 为什么是 || a = 'bar' 会在 javascript 中出现引用错误?

问题描述

代码片段是:

var a = 'foo'
a || a = 'bar'

我所期望的是它可以正常工作,这意味着a最终会'bar'。但是我得到了一个错误

未捕获的 SyntaxError:分配中的左侧无效。

根据错误,我认为可能是左侧表达式有问题。这里a || a似乎a || a无效。但是为什么?我转向ecmascript 语言规范寻求帮助。在 12.15.1 Static Semantics: Early Errors 中,我发现:

如果 LeftHandSideExpression 既不是 ObjectLiteral 也不是 ArrayLiteral 并且 LeftHandSideExpression 的 AssignmentTargetType 无效,这是一个早期参考错误。

所以,LeftHandSideExpression的AssignmentTargetTypea||a是无效的。但是我很困惑为什么a||aAssignmentTargetType是无效的。关于这个,规范刚刚说:

12.15.3 静态语义:AssignmentTargetType

赋值表达式:

产量表达

箭头函数

异步箭头函数

LeftHandSideExpression = 赋值表达式

LeftHandSideExpressionAssignmentOperatorAssignmentExpression

  1. 返回无效。

根据给出的内容,我无法弄清楚为什么a||aAssignmentTargetType 是无效的。

我的问题是:为什么a||a = 'bar'会在javascript中出现引用错误?如果是LeftHandSideExpression的AssignmentTargetType无效,为什么a||a无效?

标签: javascriptecmascript-6

解决方案


我的问题是:为什么a||a = 'bar'会在 javascript 中出现引用错误?

这不是参考错误,而是语法错误。这意味着您编写的代码无法解析为有效的程序。

如果是 LeftHandSideExpression 的 AssignmentTargetType 无效,为什么a||a无效?

它比这简单得多:赋值表达式的语法,除其他外,是

LeftHandSideExpression = AssignmentExpression

这意味着在左侧=我们需要一个LeftHandSideExpression.

||是 aLogicalORExpression但不是 a LeftHandSideExpression,因此它不能出现在这个位置。

您可以考虑以层次结构组织不同类型的表达式(我通过省略某些类型的表达式来简化以下示例):

AssignmentExpression
         ^
         |
LogicalORExpression
         ^
         |
LeftHandSideExpression
         ^
         |
PrimaryExpression
         ^
         |
Identifier Reference

即:标识符引用是 PrimaryExpression 是 LeftHandSideExpression 等。

LogicalORExpression在层次结构中较高,这使其成为包含LeftHandSideExpression. 这意味着有一些表达式,例如||,它们是 aLogicalORExpression但不是 a LeftHandSideExpression


推荐阅读