a = 1;
b = "1";
if (a == b && a = 1) {
console.log("a==b");
}
上面的Javascript代码会在Google Chrome 26.0.1410.43的if
声明中导致错误:
未捕获的ReferenceError:分配中的左侧无效
我认为这是因为无法分配语句a
,&&
的第二部分中的变量a=1
。但是,当我尝试下面的代码时,我完全糊涂了!
a = 1;
b = "1";
if (a = 1 && a == b) {
console.log("a==b");
}
为什么一个陈述是对的,但另一个陈述是错的?
答案 0 :(得分:60)
=
has lower operator precendence than both &&
and ==
,这意味着您的第一个作业将变为
if ((a == b && a) = 1) {
由于您无法以这种方式分配表达式,因此会出错。
答案 1 :(得分:21)
第二个版本被解析为a = (1 && a == b)
;也就是说,表达式1 && a == b
的结果已分配给a
。
第一个版本不起作用,因为分配的左侧未按预期解析。它会解析表达式,就好像您正在尝试为右侧的所有分配值 - (a == b && a) = 1
。
这完全基于各种运营商的优先级。这里的问题源于=
的优先级低于其他运算符的事实。
答案 2 :(得分:6)
因为操作顺序不符合您的预期。 a == b && a = 1
相当于(a == b && a) = 1
,相当于false = 1
。
如果你真的想要完成作业,你需要在它周围使用括号:a == b && (a = 1)
。
答案 3 :(得分:2)
在if (a = 1 && a == b)
,
首先执行的操作是1 && a == b
。 1 &&
执行a == b
的结果。此&&
操作的结果已分配给a
。