JS的比较运算符比较复杂,在学习了阮一峰老师JS参考教程之后做了笔记
1、相等或者不相等 先转换在比较
2、全等或者不全等 比较不转换
3、NaN与什么比较都是false
数值的自动转换分为三种情况 Number Boolean String
// 数值:转换后还是原来的值
Number(324) // 324
// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324
// 字符串:如果不可以被解析为数值,返回 NaN
Number('324abc') // NaN
// 空字符串转为0
Number('') // 0
// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
注意Number解析对象的时候先valueOf后toString,都不行在报错。
Number({
valueOf: function () {
return 2;
}
})
// 2
Number({
toString: function () {
return 3;
}
})
// 3
Number({
valueOf: function () {
return 2;
},
toString: function () {
return 3;
}
})
// 2
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
String 与Number相反先toString后valueOf
undefined
null
-0或+0
NaN
''(空字符串)
以上结果为false,其余为true。对象全部转化为true。
非想等比较首先看能否是字符串如果是则比较Unicode码点,如果无法转换则将其转换为数值在进行比较。
原始类型的非相等比较为先转换为数值在比较。对于对象要先执行valueOf后执行toString。
var x = [2];
x > '11' // true
// 等同于 [2].valueOf().toString() > '11'
// 即 '2' > '11'
// 两个字符串先比较第一个码点'2'>'1'
x.valueOf = function () { return '1' };
x > '11' // false
// 等同于 [2].valueOf() > '11'
// 即 '1' > '11'
1、不同类型返回false
true === “true” // false
2、相同类型该是啥就是啥
+0==-0
3、对象等复合类型比较地址
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
4、undefined与null自身严格相等
undefined === undefined // true
null === null // true
5、严格不相等是严格相等的反
1、原始类型值会转换为数值进行比较
2、对象与原始类型进行比较则对象先转换为原始类型的值在进行比较
[1] == 1 // true
// 等同于 Number([1]) == 1
[1] == '1' // true
// 等同于 String([1]) == Number('1')
[1] == true // true
// 等同于 Number([1]) == Number(true)
3、undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
0 == '' // true
//相等比较 转换为两个数字 0==0
0 == '0' // true
//相等比较 转化为两个数字 0==0
2 == true // false
//转换为数字 2==1
2 == false // false
//2==0
false == 'false' // false
// 0==NaN
false == '0' // true
//转换为数字 0==0
false == undefined // false
//undefined与 任何相等都不等
false == null // false
//null与 任何相等都不等
null == undefined // true
' \t\r\n ' == 0 // true