javascriptboolean-logicboolean-expressionboolean-operationsequality-operator

truthy values == false return true


So I am a beginner at javascript and learnt that there are only a limited falsy values: false, 0, -0, BigInt 0n, “”, null, undefined, NaN
Yet when I use the == operator with truthy values, this doesnt seem to be the case.
I am unable to understand the issue with the equality operator and the boolean outputs.

// outputs are written as comments
console.log(false == "0"); //true
console.log(false == []); //true

console.log(Boolean("0")); //true
console.log(Boolean([])); //true
console.log(Boolean([]) == []); //false

Solution

  • I believe you're running into this: https://stackoverflow.com/a/14581884/65387

    The false is also converted to 0 so you have 0 == 0 which is of course true.

    For false == [], you're hitting the object case (typeof [] === 'object'), so it's doing Primitive coercion, specifically this paragraph:

    Neither {} nor [] have a Symbol.toPrimitive method. Both {} and [] inherit valueOf() from Object.prototype.valueOf, which returns the object itself. Since the return value is an object, it is ignored. Therefore, toString() is called instead. {}.toString() returns "[object Object]", while [].toString() returns "", so the result is their concatenation: "[object Object]".

    So [] is converted to "", so then you have false == "".

    And then I believe you're hitting this:

    If one of the operands is a Boolean but the other is not, convert the boolean to a number: true is converted to 1, and false is converted to 0. Then compare the two operands loosely again.

    Then "" is also converted to 0.