javascript的⽐较运算符
JavaScript⼀共提供了8个⽐较运算符:
> ⼤于运算符
< ⼩于运算符
<= ⼩于等于运算符
javascript数组对象>= ⼤于等于运算符
== 相等运算符
=== 严格相等运算符
!= 不相等运算符
!== 严格不相等运算符
⾮相等的⽐较
对于⾮相等的⽐较,算法是先看两个运算⼦是否全是字符串,如果都是字符串的话,就按照Unicode码的⼤⼩⼀个字符⼀个字符来⽐较;否则的话,将两个运算⼦都转成数值,再⽐较⼤⼩
1. 字符串的⽐较是按照字典(Unicode)顺序进⾏⽐较的.
2. ⾮字符串的⽐较
原始值类型
先转换成数值然后再⽐较
注意点: 任何值与NaN(包括NaN)⽐较,都返回false
对象
如果运算⼦是对象,会转为原始类型的值再进⾏⽐较
对象转换为原始类型的值,算法是先调⽤对象的valueOf⽅法;如果返回的还是对象,再接着调⽤toString⽅法。
var x = [2];
// 输出true
// x的valueOf()返回[2],是对象类型,所以再调⽤toString(),结果是"2">"11",因为两个都是字符串,所以先⽐较第⼀个字符,"2">"1",返回true
x > '11'
x.valueOf = function(){ return '2'; }
// 返回false,因为x是对象,对象的⽐较先调⽤对象的valueOf()将对象转为原始值类型,x的valueOf()⽅法返回的是基本类型,不再调⽤toString(),结果为'2'>'21',返回false
x > '21'
相等运算符和严格相等运算符
相等运算符(==)⽐较的是两个值是否相等,严格相等运算符(===)⽐较是否为'同⼀个值'; '==='先⽐较类型,如果类型不⼀样,则直接返回false, '=='会先将他们转换为同⼀个类型,再⽤严格相等运算符进⾏⽐较
两个复合类型(对象,数组,函数)的数据⽐较时,不是⽐较它们的值是否相等,⽽是⽐较它们是否指向同⼀个地址
注意: 对于两个对象的⽐较,严格运算符⽐较的是地址,⽽⼤于或⼩于运算符⽐较的是值
严格不相等运算符
严格不相等运算符的算法是先求严格运算符的结果,然后再返回相反值
相等运算符
相等运算符⽐较同类型的数据时,与严格相等运算符完全⼀样;⽐较不同类型的数据时,相等运算符会先将数据类型转换,然后再⽤严格相等运算符⽐较
1. 原始数据类型会先转换成数值再进⾏⽐较(字符串转换为数字时,会省略前置和后置空格)
// 等同于1 === Number(true)
1 == true // true
// false 等同于 Number('true') === Number(true) ==> NaN === 1
'true' == true
2. 对象与原始类型值⽐较
1. 对象与数值类型⽐较,对象转为数值
2. 对象与字符串类型⽐较,对象转为字符串
3. 对象与布尔值⽐较时,两边都是数值
// 对象与数值类型⽐较,对象转为数值
// true 等同于 Number([2]) == 2
[2] == 2
// 对象与字符串⽐较,对象转为字符串
// true 等同于 String([3,4]) == '3,4'
[3,4] == '3,4'
/
/ 对象与布尔值⽐较,两边都转为数值
// false 等同于 Number([5]) == Number(true)
[5] == true
3. null和undefined与其他类型的值⽐较时,结果都为false,他们相互⽐较时为true: null == undefined // true
4. 相等运算符隐藏的类型转换,会带来违反直觉的结果,因此不建议使⽤想的运算符(==),最好只使⽤严格相等运算符(===): 0 == '' 返回true 不相等运算符
它的算法就是先求相等运算符的结果,然后再返回相反值