At least in JavaScript the following are true:
0 == [] // true
0 == false // true
![] == false // true
Why is that? I know that ==
means equals but not equals in type, but how is false == true
, so to speak, in that case?
JavaScript coerces objects to boolean values when using the non-strict equality operator.
0 == []
because JavaScript coerces both of the values (both of which are not of the same type) to boolean values to compare them. In other words, false == false
.
If you use ===
, on the other hand, you're checking object equality.
An interesting use case would be this:
[] === []; // => false
This is because ===
is checking the memory location of the objects. Two arrays don't share the same memory location. However:
var arr = [];
arr === arr; // ==> true
But, here's another interesting twist:
1 === 1; // ==> true
In the case of arrays and plain objects, JavaScript references the memory location. But with values like strings and numbers, JavaScript checks whether the values are absolutely equal with the ===
operator.
So the big difference comes down to differences in ==
and ===
, and how JavaScript coerces types.
Hint: This is why it's usually recommended that you use the strict ===
operator if you need to prevent coercion (however, sometimes coercion can work to your benefit, for example when working with cross-browser issues where a value might be undefined
in one browser but null
in the other browser. Then you can say something like !!thatStrangeValue
, and both undefined
and null
will be coerced to the same thing).
OP brought up a good point:
[] == false;
![] == false;
The above statements are both correct, which is strange. I would say the first statement is checking for emptiness, while the second one is checking for existence. Anyone know the answer to this last point?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With