x == y
如果x是字符串类型 则执行 Number(x) == y
如果y是字符串类型 则执行 x==Number(y)
如果双方有字符串 会先把字符串隐式转换成数字类型
例如
"123" == 22 false 会把字符串"123"转换成123 再用数字123和数字22比较
"abc" == 22 false Number("abc") 返回NaN NaN与22比较为false
x == y
如果x是布尔值 则执行 Number(x) == y
如果y是布尔值 则执行x == Number(y)
如果双方有一个是布尔值 则会先把布尔值转换成数字类型
例如:
false == 22 结果是false 因为会先执行Number(false) 为0 0 == 22
false == "22" 结果还是false 因为会先执行 Number(false) 结果为0 在执行Number("22") 结果是22 最后比较 0==22 结果是false
如果x == y
如果x是字符串或数字 y是对象类型的(对象/函数/数组)则返回x == toPrimitive(y) 的结果
如果x是对象类型, y是字符串或数字 则返回 toPrimitive(x) == y的结果
toPrimitive是将值转换成基本类型值得抽象操作,它首先会检查该值是否有valueOf()方法,如果有并且返回基本类型值,就使用该值进行强制类型转换,如果没有就使用toString()得返回值(如果存在)来进行强制类型转换。 如果 valueOf()和toString() 都不返回基本类型值 则产生TypeError错误
注 x或者y 没有写布尔类型 是因为第二条规则 如果一方有布尔值 布尔值会被先转换成数字
例如
var a = 42
var b = [42]
a== b // true
null和undefined之间得比较
规则:x == y
如果x为null y是undefined 则x == y 为true
如果x为undefined ,y是null 则x == y 为true
在 == 中null和undefined相等 (他们也与其自身相等) 除此之外其他值都不和他们两个相等
null == undefined // true
null == null // true
undefined == undefined // true
0 == null // false
fasle== undefined //false
"" ==null // false
比较少见得情况
1.
Number.prototype.valueOf = function(){
return 3
}
new Number(2) == 3 // true 因为Number(2)涉及ToPrimitive强制类型转换,因此 会调用
valueOf()
2.
"0" == false //true
false == 0 //true
false == " " //true
false == [] //true
"" == 0 //true
"" == [] //true
0 == [] //true
3.
[]==![] //true 首先执行![] 执行结果是false 然后再执行 [] == false
[]=={} //false []调用valueOf返回[] ,[]不是基本类型所以调用[]的toString() 返回 “”
{}调用valueOf 返回 {} ,{}不是基本类型所以调用{}的toString()方法返回 [ Object Object ]
所以执行"" == [Object Object] 执行结果是false