为什么Javascript运算符“&&”太奇怪了?

时间:2013-05-18 07:15:34

标签: javascript google-chrome operator-precedence

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");
}

为什么一个陈述是对的,但另一个陈述是错的?

4 个答案:

答案 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