console.log(null > 0); // false
console.log(null < 0); // false
console.log(null == 0); // false
console.log(null >= 0); // true
console.log(null <= 0); // true
先看看 X == Y 的规则
1.X和Y类型相同
以下是相等的内容,不存在隐式类型转换,都是true。
null == null
undefined == undefined
+0 == -0
true == true
false == false
对象的引用地址相同则相同,字符串完全相同的字符序列(长度相等且相同字符在相同位置)时返回true,
不满足以上条件的同类型元素的== 式就是false,对于NaN 来说,只要存在NaN 就一定是false。
2.X和Y类型不同
undefined == null 值为true 这个是规定,不存在类型转换。
X == Y,
1.X, Y 中任意一人是Boolean 类型时,把Boolean 类型的转换成数字类型进行判断。
true转成1,false转成0
2.当X Y 中一个是数字另一个是字符串,比较规则是把字符转换成数字然后在进行比较。
3.X或Y有一个是object
1)如果是对象的话,先检查是否具有valueOf 函数,如果有并且返回基本类型值,就使用该值进行强制类型转换
var obj = {
value: '123',
valueOf() {
console.log("valueOf")
return this.value
}
}
console.log(obj == 123) // true
2)如果没有ValueOf,或者ValueOf 返回的不是原始值。继续寻找toString 函数。
var obj = {
value: '123',
valueOf() {
console.log("valueOf")
return {}
},
toString() {
console.log('toString')
return this.value
}
}
console.log(obj == 123) // true
3)不符合上面规矩的,一律返回false,所以null == 0 的值是false
== 总结,除了类型相同不存在隐式类型转换外,还有一个特殊的就是 undefined == null,其他的内容最终都是转换到数字层面进行比较。
X >= Y ,X <=Y, X < Y, X >Y 的规则
1.X 和 Y 都是数字直接比较
2.X 和 Y 都是字符串比较ASCII码
3.只要存在NaN 就一定是false
4.一个数字一个字符串在数字层面比较
5.如果有对象,使用Number(obj)转化再比较
null == undefined 是true,但是null>=undefined 或者 null <= undefined 都为false,因为Number(null) 是 0,Number(undefined)为NaN,只要存在NaN就一定是false。