为什么Javascript操作符是&&&引用;这么奇怪?

为什么Javascript操作符是&&&引用;这么奇怪?,javascript,google-chrome,operator-precedence,Javascript,Google Chrome,Operator Precedence,上述Javascript代码将导致Google Chrome 26.0.1410.43中的if语句出现错误: 未捕获引用错误:赋值中的左侧无效 我认为这是因为语句&第二部分中的变量a,a=1无法赋值。然而,当我尝试下面的代码时,我完全困惑了 a = 1; b = "1"; if (a == b && a = 1) { console.log("a==b"); } 为什么一条语句是对的而另一条语句是错的?第二个版本被解析为a=(1&&a==b);也就是说,表达式1&&a=

上述Javascript代码将导致Google Chrome 26.0.1410.43中的
if
语句出现错误:

未捕获引用错误:赋值中的左侧无效

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

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

为什么一条语句是对的而另一条语句是错的?

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

第一个版本不起作用,因为赋值的左侧未按预期进行分析。它解析表达式时,就像您试图为右侧的所有内容赋值一样--
(a==b&&a)=1


这都是基于各种运算符的优先级。这里的问题源于这样一个事实,即
=
的优先级低于其他运算符。

因为操作顺序不是您所期望的
a==b&&a=1
相当于
(a==b&&a)=1
,后者相当于
false=1

如果你真的想做作业,你需要用括号括起来:
a==b&&(a=1)

,这意味着你的第一个作业变成了

a = 1;
b = "1";
if (a = 1 && a == b) {
    console.log("a==b");
}
由于不能以这种方式分配给表达式,这将给您一个错误。

中,如果(a=1&&a==b)


首先要执行的操作是
1&&a==b
。1执行
a==b
的结果。此
&
操作的结果被分配给
a

这两个表达式的解析都非常正确。他们只是没有按照OP预期的方式进行分析…@Alnitak:是的,我认为你的措辞更好。看看操作符的先例列表,你到底想在这里完成什么?代码实际应该做什么?始终使用
作为运算符的前导。如果您在这里犯了错误,您必须这样写
,如果(a==1&&a==b)
。这不完全正确优先级高于&。这将导致以下评估顺序:1。1 2. && -> 左侧已为真,不计算右侧3。a=1结果和你说的一样。但是1&&a不是首先求值的,它是1&&(a==b),其中a==b从未求值。通常,对于a=b&&c==d,计算顺序为(假设b为falsy):1。b 2。c==d3。b&(c==d)4。我的评论也错了这次你说得对。对于a&&b,仅当a为真时,才会计算给定的b。在我最后的评论中,我说a必须是假的。
if ((a == b && a) = 1) {