JS的比较运算符,数值自动转换笔记
JS的比较运算符比较复杂,在学习了阮一峰老师JS参考教程之后做了笔记
总体思路
1、相等或者不相等 先转换在比较
2、全等或者不全等 比较不转换
3、NaN与什么比较都是false
数值的自动转换
数值的自动转换分为三种情况 Number Boolean String
Number
1 | // 数值:转换后还是原来的值 |
注意Number解析对象的时候先valueOf后toString,都不行在报错。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Number({
valueOf: function () {
return 2;
}
})
// 2
Number({
toString: function () {
return 3;
}
})
// 3
Number({
valueOf: function () {
return 2;
},
toString: function () {
return 3;
}
})
// 2
String
1 | String(123) // "123" |
String 与Number相反先toString后valueOf
Boolean
1 | undefined |
以上结果为false,其余为true。对象全部转化为true。
非相等比较
非想等比较首先看能否是字符串如果是则比较Unicode码点,如果无法转换则将其转换为数值在进行比较。
原始类型的非相等比较
原始类型的非相等比较为先转换为数值在比较。对于对象要先执行valueOf后执行toString。1
2
3
4
5
6
7
8
9
10var 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、对象等复合类型比较地址1
2
3{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
4、undefined与null自身严格相等1
2undefined === undefined // true
null === null // true
5、严格不相等是严格相等的反
相等运算符
1、原始类型值会转换为数值进行比较
2、对象与原始类型进行比较则对象先转换为原始类型的值在进行比较1
2
3
4
5
6
7
8[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。
奇形怪状的解
1 | 0 == '' // true |