
That’s it. That’s the meme.
Javascript’s type coercion is rather insane, yes, but there is an actual, practical reason it’s done. JS, having been designed to be run in web browsers, wants to avoid blowing up and crashing at all costs. If it gets an unusual type comparison, usually the result of a bug, it tries to return something, such that the script can continue running if at all possible. In JS’ mentality, keeping a page running, even if it might not completely function properly, is preferable to throwing an unhandled exception and completely crashing it.
Whether or not that is the right approach is debatable, but there is at least some logic to it. Personally, I think that the proliferation of Node letting JS run outside of browsers exacerbates a lot of JS’ issues, but TypeScript does a lot to make it look like a more sensible language.

To make it even worse
Mh, ‘0’ is a nonempty string, so !‘0’ returns false. Then of course !(!‘0’) would return true. I’d absolutely expect this, Python does the same.
And the second thing is just JavaScript’s type coercion shenanigans. In Python
bool('0') # returns True because of nonempty string bool(int('0')) # returns False because 0 == FalseKnowing that JavaScript does a lot of implicit type conversions, stuff like that doesn’t strike me as very surprising.


