介绍
JavaScript是一种动态类型语言,在某些情况下会进行隐式类型转换,也称为强制类型转换。当使用双等号==判断表达式是否相等时,可能导致意外的结果。
首先要了解不同类型的转换规则是什么样的
原始类型->数字:
- true -> 1
- false -> 0
- null -> 0
- undefined -> NaN
- 空字符串或空白字符 -> 0
- 不是数字的字符串 -> NaN
所有类型->布尔值:
- null -> false
- undefined -> false
- 0 -> false
- 空字符串 -> false
- 其他所有的 -> true
原始类型->字符串:
- null -> 'null'
- undefined -> 'undefined'
- 数字 -> '数字'
- true -> 'true'
- false -> 'false'
对象->原始类型:
- 先调用对象的
valueOf方法,如果valueOf返回的是原始值,则返回该值; - 如果不是原始值,则再调用
toString方法,如果返回的是原始值,则返回该值; - 如果不是,则报错。
双等号比较规则
当等号两边为相同的数据类型时:
- 对象(Object):仅当两边引用同一个对象时返回
true。 - 大整形(BigInt):仅当两边数值相同时返回
true。 - 符号(Symbol):仅当两边引用相同的符号时返回
true。 - 字符串(String):仅当两边字符串相同时返回
true。 - 数值(Number):仅当两边数值相同时返回
true。如果任何一个数是NaN,返回false。 - 布尔值(Boolean):仅当两边都为
true或都为false时返回true。 - null和undefined:只有和自己或者互相比较时返回
true。
示例
1 == NaN // false
null == undefined // true
当等号两边为不同的数据类型时:
- 数字 vs 字符串:字符串会转为数字再比较
- 布尔值 vs 其它:其他类型会转为布尔值再比较
- 对象 vs 其它:对象转为对应的原始类型再比较
示例
1 == '1' // true
false == 0 // true
true == [] // true
true == {} // true
{} == true // true
[] == false // false
[] == ![] // true
{} == !{} // false
结论
JavaScript的隐式类型转换在确保不同数据类型之间的灵活和便利操作中发挥作用。
虽然隐式类型转换在某些情况下可能有帮助,但了解其行为是很重要的,以避免意外的结果。