Why does !!1=="1" equal true and !!2=="2" equal false?

javascript

Solution

As per the Operator precedence rules, logical `!` has higher priority over `==`. So, in both the cases, `!!` is evaluated first.

Note: Truthiness of various objects have been explained in this answer of mine.

First Case

!!1 == "1"

`!1` will be evaluated to `false`, since `1` is considered Truthy. Negating again we get `true`. So the expression becomes

true == "1"

Now, the coercion rules kick in as you have used `==` operator, which evaluates as per the The Abstract Equality Comparison Algorithm defined in ECMAScript 5.1 Specification,

6. If `Type(x)` is `Boolean`, return the result of the comparison `ToNumber(x) == y`.

So, `true` will be converted to a number, which is 1 as per `ToNumber` algorithm for Boolean values. Now the expression becomes

1 == "1"

Now,

4. If `Type(x)` is `Number` and `Type(y)` is `String`, return the result of the comparison `x == ToNumber(y)`.

So, `"1"` will be converted to a number and that will give 1, as per the `ToNumber` algorithm. That is why it shows `true` in the first case.

Second Case

The same rules are applied here.

!!2 == "2"

becomes

true == "2"

then

1 == "2"

which becomes

1 == 2

which is not `true`, that is why the second case prints `false`.

Problem

As the title states, why does: ``` > !!1=="1" ``` equal ``` True ``` and ``` > !!2=="2" ``` equal: ``` False ``` Likewise, why does `> "1"==true` equal `true` and `> "2"==true` equal `false` I'm baffled. Are these just bugs in JS or what's going on here?

Original source

Related problems