使用 == 时,不同类型的值也可以被看作相等。因为在使用 ==时会对值进行转换,如下用表格分析一下不同类型的值用相等运算符比较后的结果:
类型(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()。
toPrimitive(input, preferedType?);
input是输入的值,即要转换的对象,必选;
preferedType是期望转换的基本类型,他可以是字符串,也可以是数字。选填,默认为number;
执行过程:
如果转换的类型是number,会执行以下步骤:
- 如果input是原始值,直接返回这个值;
- 否则,如果input是对象,调用input.valueOf(),如果结果是原始值,返回结果;
- 否则,调用input.toString()。如果结果是原始值,返回结果;
- 否则,抛出错误。
如果转换的类型是String,2和3会交换执行,即先执行toString()方法。
你也可以省略preferedType,此时,日期会被认为是字符串,而其他的值会被当做Number。
在操作符中,==,排序运算符,加减乘除,在对非原始值进行操作时,都会调用内部的toPrimitive()方法。