错误的常见原因:
- 使用赋值 (
=
) 而不是相等 ( ==
/ ===
)
- 分配给函数的结果
foo() = 42
而不是传递参数 ( foo(42)
)
- 只是缺少成员名称(即假设一些默认选择):
getFoo() = 42
而不是getFoo().theAnswer = 42
或数组索引getArray() = 42
而不是getArray()[0]= 42
在这种特殊情况下,您想使用==
(或者更好===
- Javascript 中的 Type Coercion 到底是什么?)来检查是否相等(例如if(one === "rock" && two === "rock")
,但您收到错误的实际原因更棘手。
错误的原因是Operator priority。特别是我们正在寻找&&
(precedence 6) 和=
(precedence 3)。
让我们根据优先级在表达式中添加大括号 -&&
高于=
因此它首先执行,类似于以下3+4*5+6
操作3+(4*5)+6
:
if(one= ("rock" && two) = "rock"){...
现在我们有类似于多个赋值的表达式a = b = 42
,由于从右到左的关联性,执行为a = (b = 42)
. 所以添加更多的大括号:
if(one= ( ("rock" && two) = "rock" ) ){...
最后我们遇到了实际问题:("rock" && two)
不能评估为可以分配给的 l 值(在这种特殊情况下,它的值为two
真值)。
请注意,如果您使用大括号将每个“平等”周围的感知优先级与大括号匹配,则不会出现错误。显然,这也会产生与您预期不同的结果 -由于逻辑 &&&&
的行为,这两个变量的值都发生了变化,而不是在两个字符串上"rock" && "rock"
发生了变化"rock"
(这反过来又是真实的):
if((one = "rock") && (two = "rock"))
{
// always executed, both one and two are set to "rock"
...
}
有关错误的更多详细信息以及可能发生的其他情况 - 请参阅规范:
任务
LeftHandSideExpression = AssignmentExpression
...
如果以下条件都为真,则抛出 SyntaxError 异常:
...
IsStrictReference(lref) 为真
左侧表达式
和解释 IsStrictReference的参考规范类型:
...函数调用被允许返回引用。这种可能性纯粹是为了宿主对象而被承认的。本规范定义的内置 ECMAScript 函数没有返回引用,也没有规定用户定义的函数返回引用......