7

I was expecting the following comparison to give an error:

var A = B = 0;
if(A == B == 0)
    console.log(true);
else
    console.log(false);

but strangely it returns false.

Even more strangely,

console.log((A == B == 1)); 

returns true.

How does this "ternary" kind of comparison work?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
laggingreflex
  • 32,948
  • 35
  • 141
  • 196

6 Answers6

8

First, we need to understand that a == comparison between a number and a boolean value will result in internal type conversion of Boolean value to a number (true becomes 1 and false becomes 0)

The expression you have shown is evaluated from left to right. So, first

A == B

is evaluated and the result is true and you are comparing true with 0. Since true becomes 1 during comparison, 1 == 0 evaluates to false. But when you say

console.log((A == B == 1));

A == B is true, which when compared with number, becomes 1 and you are comparing that with 1 again. That is why it prints true.

thefourtheye
  • 233,700
  • 52
  • 457
  • 497
8

Assignment operators like = are right-associative: when there is a series of these operators that have the same precedence, they are processed right-to-left, so A = B = 0 is processed as A = (B = 0) (B = 0 returns 0, so both A and B end up as 0).

Equality operators like == are left-associative: same-precedence operators are processed left-to-right. A == B == 0 is processed as (A == B) == 0, and since A == B is true (1), it becomes 1 == 0, which is false (0).

Likewise, A == B == 1 is processed as (A == B) == 1, which becomes 1 == 1, which is true (1).

Source and more info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

kwc
  • 307
  • 2
  • 8
2

First, A == B returns true, which is then compared to 0, true == 0 which returns false, or true == 1 which returns true.

Mosho
  • 7,099
  • 3
  • 34
  • 51
2

It first checks your clause for A == B, which is true, than it starts checking true == 0, and 0 is false. So when you check A == B == 1, you check A==B, which is true, and true == 1. So then it returns true. If you really want to check all possibilities you should do something like this:

if((A==B) && (A==0))
   console.log(true);
else 
   console.log(false);
Max Langerak
  • 1,187
  • 8
  • 17
1
if((A == B)&& (A== 0)&& (B==0))
    console.log(true);
else
    console.log(false);
Sardor Dushamov
  • 1,665
  • 3
  • 17
  • 44
1

You can work from left to right. In this case you first check if A == B, then you check if this equal to 0. So since A == B, this is true. So now it becomes (true == 0), which is false. If A=1, B=2, then (A == B == 0) would return true! This is because A == B is false and (false == 0) is true!

MShah
  • 316
  • 1
  • 6