2013-05-18 79 views
18
a = 1; 
b = "1"; 
if (a == b && a = 1) { 
    console.log("a==b"); 
} 

上述JavaScript程式码会导致错误在谷歌浏览器26.0.1410.43的if声明:为什么Javascript运算符“&&”很奇怪?

Uncaught ReferenceError: Invalid left-hand side in assignment

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

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

为什么一个语句正确但其他语句错误?

+3

无论如何你想在这里完成什么?代码实际上应该做什么? –

+2

总是使用'('和')'作为运算符优先级 –

+1

您在这里犯了一个错误,您必须像这样写'if(a == 1 && a == b)'。 –

回答

21

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

第一个版本不起作用,因为分配的左侧未按预期进行分析。它解析表达式,就好像你试图给分配一个值在右边 - (a == b && a) = 1

这是基于各个运营商的优先级。这里的问题源于=比其他运营商具有更低的优先级。

+2

这两个表达式都可以正确解析。他们只是没有解析OP的预期方式... – Alnitak

+0

@Alnitak:是的,我认为你的措辞更好。 –

+1

请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence获取运算符优先级列表 – MofX

6

因为操作顺序不符合您的期望。 a == b && a = 1相当于(a == b && a) = 1,相当于false = 1

如果您确实想完成作业,则需要使用括号:a == b && (a = 1)

60

= has lower operator precendence than both && and ==,这意味着你的第一个任务变成

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

因为你不能分配以这种方式表达,这会给你一个错误。

+0

,谢谢!终于有了! – sherlock

+0

这对我来说是新的,感谢您发布链接到MDN –

2

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

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

+0

这不完全正确。 ==具有比&&更高的优先级。这会导致以下评估顺序: 1. 1 2. && - >左手侧已为真,不要评估右手侧 3。a = 1 结果与您所说的相同。但1 && a不是首先评估的,它是1 &&(a == b),其中a == b永远不会被评估。 通常为A = B &&Ç== d所述评价顺序将(假设b为falsy): 1. b 2.Ç== d 3. b &&(C == d) 4。 a =(b &&(c == d)) – MofX

+0

对不起。我纠正了错误。 – Deepu

+0

我的评论也是错误的;)这次你说得对。用&&​​ b给定b只会被评估,如果a是真的。在我最后的评论中,我说过必须是假的。 – MofX