使用 == 时,不同类型的值也可以被看作相等。因为在使用 ==时会对值进行转换,如下用表格分析一下不同类型的值用相等运算符比较后的结果:

    类型(x) 类型(y) 结果
    null undefined true
    undefined null true
    字符串 x == toNumber(y)
    字符串 toNumber(x) == y
    布尔值 任何类型 toNumber(x) == y
    任何类型 布尔值 x == toNumber(y)
    字符串或数 对象 x == toPrimitive(y)
    对象 字符串和数 toPrimitive(x) == y

    在JavaScript中,如果想要将对象转换成基本类型时,也就是所谓的拆箱时,会调用toPrimitive()。

    1. toPrimitive(input, preferedType?);

    input是输入的值,即要转换的对象,必选;
    preferedType是期望转换的基本类型,他可以是字符串,也可以是数字。选填,默认为number;
    执行过程:
    如果转换的类型是number,会执行以下步骤:

    • 如果input是原始值,直接返回这个值;
    • 否则,如果input是对象,调用input.valueOf(),如果结果是原始值,返回结果;
    • 否则,调用input.toString()。如果结果是原始值,返回结果;
    • 否则,抛出错误。

    如果转换的类型是String,2和3会交换执行,即先执行toString()方法。
    你也可以省略preferedType,此时,日期会被认为是字符串,而其他的值会被当做Number。
    在操作符中,==,排序运算符,加减乘除,在对非原始值进行操作时,都会调用内部的toPrimitive()方法。