[] == ![] evaluates to true [] == ![] evaluates to true arrays arrays

[] == ![] evaluates to true


Basically Javascript tries to convert both the sides into Number if both the types are not same. And if its an Object, It tries to convert into primitive value

So in this case step by step will be

=> []==![]=> []==false // Type conversion by the statement itself=> []==0 // To number of right operand=> ""==0 // To Primitive call for Array which will in this case convert to empty string=> 0==0 // To number call of "" which is 0=> true

One can check for the ecmascript explanation here in the compiler description http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


Whenever 2 values are compared using == , javascript performs the Abstract Equality Comparison Algorithm.

enter image description here

Here, x is [], and y is ![].Also,

typeof([]) // "object"typeof(![]) // "boolean"

Since y is a boolean and x is an object, condition 7 is the first to hold:

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

What’s the value of ToNumber(y)?

Number(![]) // 0

because [] is a truthy value, negating makes it false. Number(false) is 0

Now we have the comparison: [] == 0.

Since typeof(0) is "number", condition 8 now holds:

If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.

ToPrimitve(x) is like x.toString().

[].toString() // ”” - the empty string

Almost done we now face with the comparison: “” == 0

Now, condition 5 holds:

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

ToNumber(“”) // 0

Finally both operands have the same type and condition 1 holds. I think you can take if from here :)

read about Abstract Equality Comparison on the specs!


![] evaluates to false because the reference is truthy. [] can be converted to an number (0 in this case) which is falsey. Therefore: the condition passes as equal. If you did === it would be false.