原文地址:https://wangdoc.com/javascript/
概述
JavaScript一共提供了8个比较运算符。
- >大于比较运算符
- <小于比较运算符
- <=小于等于比较运算符
- >=大于等于比较运算符
- ==相等运算符
- ===严格相等运算符
- !=不相等运算符
- >=严格不相等运算符
这八个比较运算符分为两类:相等比较和非相等比较。两者的规则是不一样的,对于非相等比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较Unicode码点);否则,将两个运算子都转成数值,再比较数值的大小。
非相等运算符:字符串的比较
JavaScript引擎内部首先比较首字符的Unicode码点。如果相等,在比较第二个字符的Unicode码点,以此类推。
非相等运算符:非字符串的比较
如果两个运算子都不是字符串,分为以下两种情况
(1)原始类型值
如果两个运算子都是原始类型的值,则是先转成数值再比较。
5 > '4'
// 等同于 5 > Number('4')
任何值(包括NaN本身)与NaN比较,返回的都是false。
(2)对象
如果运算子是对象,会转为原始类型的值,再进行比较。对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。
var x = [2];
x > "11" // true
// 等同于 [2].valueOf().toString() > "11"
// 即"2" > "11"
x.valueOf = function() { return "1"; }
x > "11" // false
// 等同于 [2].valueOf() > "11"
// 即"1" > "11"
严格相等运算符
JavaScript提供两种相等运算符:和=。
简单的,它们的区别是相等运算符()比较两个值是否相等,严格相等运算符()比较它们是否为同一个值。如果两个值不是同一类型,严格相等运算符直接返回false,而相等运算符会将它们转换成同一类型,再用严格相等运算符进行比较。
(1)不同类型的值
如果两个值类型不同,直接返回false。
1 === "1" // false
true === "true" // false
true == "true" // false
true == "1" //true
(2)同一类的原始类型
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相等就返回true,值不同就返回false。NaN与任何值都不相等,包括自身。另外,正0等于负0。
(3)复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。
[] === [] // false
{} === {} // false
(function() {} === function() {}) // false
var v1 = {};
v2 = v1;
v1 === v2; // true
注意:**对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值**。
**(4)undefined和null**
<font color=red>undefined</font>和<font color=red>null</font>与自身严格相等。
```js
undefined === undefined // true
null === null // true
由于变量声明后默认值是undefined,因此两个只声明没有赋值的变量是相等的。
var v1;
var v2;
v1 === v2 // true
(6)相等运算符
相等运算符用来比较相同类型的数据是,与严格相等运算符完全一样。
1 == 1.0
1 === 1.0
比较不同类型的数据是,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。
- 原始类型值
原始类型的值会转换成数值再进行比较。
1 == true // true
// 等同于 1 === Number(true)
- 对象与原始类型值比较
对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
// 对象和数值比较时,对象转为数值
[1] == 1 //true
// 等同于 Number([1]) == 1
// 对象和字符串比较时,对象转为字符串
[1] == "1" // true
// 等同于String([1]) == "1"
[1, 2] == "1,2" // true
// 对象和布尔值比较时,两边都转为数值
[1] == true // true
[2] == true // false
- undefined和null
undefined和null与其他类型比较时,结构都为false,它们互相比较时,结果为true。
false == null //false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
由于相等运算符隐藏的类型转换,会带来一些违反直觉的结果。因此建议不要使用相等运算符,最好只使用严格相等运算符。