常见的误区是:“== 检查值是否相等,=== 检查值和类型是否相等”
正确的解释是:“== 允许在相等比较中进行强制类型转换,而=== 不允许。”
抽象相等比较算法
ES5规范11.9.3节对抽象相等比较算法定义如下: ES5规范
以 x 和 y 为值进行 x == y 比较会产生的结果可为 true 或 false。比较的执行步骤如下:
|
|
- 字符串和数字之间的相等:调用ToNumber(),将字符串转换为数字类型
其他类型和布尔类型之间的相等:调用ToNumber(),将布尔类型转换为数字类型
12345678910111213141516171819202122var a = "42";强制类型转换 | 81// 不要这样用,条件判断不成立:if (a == true) {// ..}// 也不要这样用,条件判断不成立:if (a === true) {// ..}// 这样的显式用法没问题:if (a) {// ..}// 这样的显式用法更好:if (!!a) {// ..}// 这样的显式用法也很好:if (Boolean( a )) {// ..}null 和undefined 之间的相等:null==undefined 返回true
- 对象和非对象之间的相等:调用ToPrimitive()方法,将对象转为标量基本类型。
为了将值转换为相应的基本类型值,抽象操作ToPrimitive会首先检查该值是否有valueOf() 方法。
如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。如果valueOf() 和toString() 均不返回基本类型值,会产生TypeError 错误。
Object | valueOf()返回值 | toString()返回值 |
---|---|---|
数组Array | 返回数组实例 | 将Array的元素转为字符串,用逗号分隔 |
布尔值Boolean | 布尔值 | 转换为”true”或”false” |
日期Date | 从1970年到目前的时间(毫秒) | 返回日期的文本表示形式。 |
函数Function | 函数本身 | 返回如下格式字符串:function Name(){[native code]} |
数字Number | 数字值 | 返回数字文本形式 |
对象Object | 对象本身,默认值 | 返回”[object objectname]”,objectname为对象类型的名称 |
字符串String | 字符串值 | 返回String对象的值 |
严格等于比较算法
|
|