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

18
a = 1;
b = "1";
if (a == b && a = 1) {
    console.log("a==b");
}

上面的JavaScript代码在Google Chrome 26.0.1410.43中会在if语句中导致错误:

Uncaught ReferenceError: Invalid left-hand side in assignment

我认为这是因为语句的第二部分&&中的变量a无法被赋值。然而,当我尝试下面的代码时,我完全困惑了!

a = 1;
b = "1";
if (a = 1 && a == b) {
    console.log("a==b");
}

为什么一个语句是正确的,而另一个语句是错误的?


3
你到底想在这里实现什么?代码应该做些什么? - Ja͢ck
2
始终使用 () 来确定运算符优先级。 - Mehmet Ince
1
你在这里犯了一个错误,你必须这样写 if(a==1 && a == b) - Ashish Rawat
4个回答

60

=的运算优先级比&&==都要低,这意味着你的第一个赋值语句会变成

if ((a == b && a) = 1) {

由于你不能以这种方式分配到一个表达式,因此这将导致错误。


21
第二个版本被解析为a = (1 && a == b);也就是说,表达式1 && a == b的结果被赋给了a
第一个版本不起作用,因为赋值左边的表达式没有按照您预期的方式进行解析。它在解析时会将表达式视为您试图将值分配给右侧的所有内容--(a == b && a) = 1
这一切都基于各种运算符的优先级。问题在于=的优先级低于其他运算符。

2
这两个表达式都被完美地解析了。只是它们的解析方式与原帖作者所期望的不同... - Alnitak
@Alnitak:是的,我认为你的措辞更好。 - Tikhon Jelvis
1
请查看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence 获取运算符优先级列表。 - MofX

6

因为操作顺序不是您期望的。 a == b && a = 1 等同于 (a == b && a) = 1,这等同于 false = 1

如果您真的想完成赋值操作,您需要在其周围使用括号: a == b && (a = 1)


2
if (a = 1 && a == b) 中,
首先要执行的操作是 1 && a == b。先执行 1 && a == b 的结果。这个 && 操作的结果被赋值给了 a

这并不完全正确。== 的优先级高于 &&。这导致以下评估顺序:
  1. 1
  2. && -> 左侧已经为 true,不评估右侧
  3. a = 1
结果与您所说的相同。但是 1 && a 不是首先被评估的,而是 1 && (a == b),其中 a == b 永远不会被评估。通常对于 a = b && c == d,评估顺序将是(假设 b 是 falsy):
  1. b
  2. c == d
  3. b && (c == d)
  4. a = (b && (c == d))
- MofX
我的评论也是错的 ;) 这次你做对了。当给定 a && b 时,只有在 a 为 true 时才会评估 b。在我上一条评论中,我说 a 必须为 false。 - MofX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接