为什么Javascript运算符"&&"如此奇怪?

she*_*ock 18 javascript google-chrome operator-precedence

a = 1;
b = "1";
if (a == b && a = 1) {
    console.log("a==b");
}
Run Code Online (Sandbox Code Playgroud)

上面的Javascript代码会导致if Google Chrome 26.0.1410.43 中的语句出错:

未捕获的ReferenceError:赋值中的左侧无效

我想这是因为该变量a在声明的第二部分&&,a=1不能分配.但是,当我尝试下面的代码时,我完全糊涂了!

a = 1;
b = "1";
if (a = 1 && a == b) {
    console.log("a==b");
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*son 60

=具有比既能降低运营商precendence &&==,这意味着你的第一个任务变成

if ((a == b && a) = 1) {
Run Code Online (Sandbox Code Playgroud)

由于您无法以这种方式分配表达式,因此会出错.


Tik*_*vis 21

第二个版本被解析为a = (1 && a == b); 也就是说,表达式的结果1 && a == b被赋值给了a.

第一个版本不起作用,因为分配的左侧未按预期解析.它解析表达式,好像你试图为右边的所有东西赋值 - (a == b && a) = 1.

这完全基于各种运营商的优先级.这里的问题源于=优先级低于其他运算符的事实.

  • 两个表达式都完全正确解析.他们只是没有像OP预期的那样解析... (2认同)

JJJ*_*JJJ 6

因为操作顺序不符合您的预期.a == b && a = 1相当于(a == b && a) = 1等于false = 1.

如果你真的想要完成任务,你需要在它周围使用括号:a == b && (a = 1).