javascript - 为什么是 || 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||a
AssignmentTargetType是无效的。关于这个,规范刚刚说:
12.15.3 静态语义:AssignmentTargetType
赋值表达式:
产量表达
箭头函数
异步箭头函数
LeftHandSideExpression = 赋值表达式
LeftHandSideExpressionAssignmentOperatorAssignmentExpression
- 返回无效。
根据给出的内容,我无法弄清楚为什么a||a
AssignmentTargetType 是无效的。
我的问题是:为什么a||a = 'bar'
会在javascript中出现引用错误?如果是LeftHandSideExpression的AssignmentTargetType无效,为什么a||a
无效?
解决方案
我的问题是:为什么
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
。
推荐阅读
- java - arraylist - indexoutofboundsexception
- node.js - Node.js - 如何继续描述 Cloudwatch 日志查询以获取特定查询的已完成状态
- excel - UserForm:停止执行代码,但让用户查看工作簿?
- mongoose - 在 apollo-react 问题中默认获取更多分页或仅网络策略
- javascript - 在使用 p5js 时查找 arc() 边缘
- javascript - Javascript 设置 Cookie 将 cookie 留空(Chrome、Linux Mint)
- amazon-web-services - 如何使用顶级账户中的 AWS Single Sign On 从不同账户配置多个 AWS Connect 实例?
- hadoop - MapReduce 作业永远不会进入运行状态
- microservices - 微服务开发中是否存在用于对数据库表进行版本控制的“最佳实践”?
- sql - 使用 t-sql MERGE 复制或创建数据