javascript 中“==”带来的隐式类型转换规则
一 字符串、数字和布尔值之间的转换规则(抽象操作)
- ToPrimitive
抽象操作ToPrimitive会检查该值是否有valueOf()方法,如果有且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()方法的返回值(如果存在)来进行强制类型转换。 - ToString 非字符串到字符串的强制转换
null =》 “null”
undefined =》 “undefined”
true => “true”
Array =》join(“,”)
对普通对象来说,除非自行定义,否则toString()返回内部属性[[Class]]的值,如 [object Object] - ToNumber
true =》 1
undefined =》 NaN
null =》 0
“” => +0
对象
(1) 令primValue为 ToPrimitive(输入参数, 暗示数值类型)。
(2) 返回 ToNumber(primValue)。
(3) 如果valueOf()和toString()均不返回基本类型值,会产生TypeError错误 ToBoolean 会被转换为假值的值
0,+0,-0,NaN
“”
undefined
null
false
可以认为,除以上假值列表以外的值,都将被转化为真值
二 ==中的隐式类型转换规则
字符串和数字之间的比较,ES5规范11.9.3.4-5规定如下 x == y
(1) 如果Type(x) 是数字,Type(y) 是字符串,则返回x == ToNumber(y) 的结果。(2) 如果Type(x) 是字符串,Type(y) 是数字,则返回ToNumber(x) == y 的结果。
总结 数字与字符串相比,比较的是将字符串转为数字
其他类型和布尔类型的比较, ES5规范11.9.3.4-5规定如下 x == y
(1) 如果Type(x) 是布尔类型,则返回ToNumber(x) == y 的结果;(2) 如果Type(y) 是布尔类型,则返回x == ToNumber(y) 的结果。
总结 其他类型与布尔类型比,现将布尔类型转为数字,然后执行数字与数字之间的比较或数字与字符串之间的比较
undefined和null之间的转换
(1) 如果x 为null,y 为undefined,则结果为true。(2) 如果x 为undefined,y 为null,则结果为true。
总结 在== 中null 和undefined 是一回事,可以相互进行隐式强制类型转换。其他值都不存在这种情况
对象与非对象之间的相等比较
(1) 如果Type(x) 是字符串或数字,Type(y) 是对象,则返回x == ToPrimitive(y) 的结果(2) 如果Type(x) 是对象,Type(y) 是字符串或数字,则返回ToPromitive(x) == y 的结果
为了将值转换为相应的基本类型值,抽象操作ToPrimitive(参见ES5 规范9.1 节)会首先(通过内部操作DefaultValue,参见ES5 规范8.12.8 节)检查该值是否有valueOf() 方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。如果valueOf() 和toString() 均不返回基本类型值,会产生TypeError 错误。
三 两个比较特殊的==判断
1. NaN == NaN // =>false
2. [] == ![] // => true