1) ![]
Any object instance (including []) is a truthy value. ![] -> !true -> false
2) !0
0 is falsy value. !0 -> !false -> true
3) [] == 0
When comparing an object with a primitive value (another number in this case), the object is transformed to a primitive too. [] == 0 -> 0 == 0 -> true
4) !0 == ![]
!0 == ![] -> !false == ![] -> true == ![] -> true == !true -> true == false -> false
5) 0 == Boolean ([])
As mentioned, an object when transformed to boolean is always true and 0 is falsy. 0 == Boolean ([]) -> 0 == true -> 0 == 1 -> false
6) [] == false
[] == false -> [] == 0 -> 0 == 0 -> true
7) Boolean([])
An object reference is always true. Boolean([]) -> true
8) [] == Boolean([])
[] == Boolean([]) -> [] == true -> [] == 1 -> 0 == 1 -> false
Check this interesting post about comparison and types conversion.