Search code examples
javascriptcoercion

String coercion into boolean


Boolean("a")

returns true in the Browser console.
So why

"a" == true

returns false?


Solution

  • How the == operator functions on certain types is defined in the ECMAScript specifications. It is as followed:

    7.2.13 Abstract Equality Comparison

    The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

    1. If Type(x) is the same as Type(y), then Return the result of performing Strict Equality Comparison x === y.
    2. If x is null and y is undefined, return true.
    3. If x is undefined and y is null, return true.
    4. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ! ToNumber(y).
    5. If Type(x) is String and Type(y) is Number, return the result of the comparison ! ToNumber(x) == y.
    6. If Type(x) is Boolean, return the result of the comparison ! ToNumber(x) == y.
    7. If Type(y) is Boolean, return the result of the comparison x == ! ToNumber(y).
    8. If Type(x) is either String, Number, or Symbol and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
    9. If Type(x) is Object and Type(y) is either String, Number, or Symbol, return the result of the comparison ToPrimitive(x) == y.
    10. Return false.

    Now we can apply them to this the cases above. Which first converts the boolean into a number and then attempts to convert the string into a number (which is parsed as NaN):

    "a" == true
    // Case 7 (true --> 1)
    // =>"a" == 1
    // Case 5 ("a" --> NaN)
    // => NaN == 1
    => false