# 比较运算符

# 比较运算符汇总

  • > 大于运算符
  • < 小于运算符
  • <= 小于或等于运算符
  • >= 大于或等于运算符
  • == 相等运算符
  • === 严格相等运算符
  • != 不相等运算符
  • !== 严格不相等运算符

# 非相等比较

# 1. 字符串类型比较

字符串按照字典顺序进行比较。

'cat' > 'dog' // false
'cat' > 'catalog' // false
1
2

JavaScript 引擎内部首先比较首字符的 Unicode 码点。如果相等,再比较第二个字符的 Unicode 码点,以此类推。

var str = '天气';
alert( str.charCodeAt(0) );
//22825

alert( String.fromCharCode(22825, 27668) );
//天气
1
2
3
4
5
6

以上是字符串和Unicode编码互相转换的方式。

# 2. 原始数据类型比较

如果两个运算子都是原始类型的值,则是先转成数值再比较。

5 > '4' // true
// 等同于 5 > Number('4')
// 即 5 > 4

true > false // true
// 等同于 Number(true) > Number(false)
// 即 1 > 0

2 > true // true
// 等同于 2 > Number(true)
// 即 2 > 1
1
2
3
4
5
6
7
8
9
10
11

这里需要注意与NaN的比较。任何值(包括NaN本身)与NaN比较,返回的都是false。

1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false
1
2
3
4
5
6

# 3. 复合数据类型(对象)比较

对象转换成原始类型的值,算法是先调用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'
1
2
3
4
5
6
7
8
9
[2] > [1] // true
// 等同于 [2].valueOf().toString() > [1].valueOf().toString()
// 即 '2' > '1'

[2] > [11] // true
// 等同于 [2].valueOf().toString() > [11].valueOf().toString()
// 即 '2' > '11'

{ x: 2 } >= { x: 1 } // true
// 等同于 { x: 2 }.valueOf().toString() >= { x: 1 }.valueOf().toString()
// 即 '[object Object]' >= '[object Object]'
1
2
3
4
5
6
7
8
9
10
11

# 相等(严格)比较

# 1. 严格相等

如果两个值的类型不同,直接返回false。

1 === "1" // false
true === "true" // false
1
2

同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。

1 === 0x1 // true
1

NaN与任何值都不相等(包括自身)。另外,正0等于负0。

NaN === NaN  // false
+0 === -0 // true
1
2

两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
1
2
3

对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。

var v1 = {};
var v2 = v1;
v1 === v2 // true

var obj1 = {};
var obj2 = {};

obj1 > obj2 // false
obj1 < obj2 // false
obj1 === obj2 // false
1
2
3
4
5
6
7
8
9
10

undefined和null与自身严格相等。

undefined === undefined // true
null === null // true
1
2
var v1;
var v2;
v1 === v2 // true
1
2
3

# 2. 严格不相等

严格相等运算符有一个对应的“严格不相等运算符”(!==),它的算法就是先求严格相等运算符的结果,然后返回相反值。

1 !== '1' // true
// 等同于
!(1 === '1')
1
2
3