The "Abstract Equality Comparison Algorithm" has many parts, but the important one here is this:
If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
(There's a mirror-image of that too.) So, because ""
is a string and [null]
is an object, we've got to first convert [null]
to a string by calling ToPrimitive([null])
. That's an internal operation described as follows, when it's asked to convert an Object instance to a primitive value:
Return a default value for the Object. The default value of an object is retrieved by calling the [[DefaultValue]] internal method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] internal method is defined by this specification for all native ECMAScript objects in 8.12.8.
Now, the [[DefaultValue]] internal operation will call .toString()
on the object and return that value. Try [null].toString()
in your browser console:
> [null].toString()
""
And there you have it.
Edit: And why is [null].toString()
an empty string? Because the .toString()
operation on Array instances always just calls .join()
, and that always yields an empty string for null
and undefined
values. Thus an array of one null
ends up as just a single empty string.