乐趣区

运算符-比较运算符

1. 概述

大于运算符
< 小于运算符
<= 小于或等于运算符
= 大于或等于运算符
== 相等运算符
=== 严格相等运算符
!= 不相等运算符
!== 严格不相等运算符
2. 大小与运算符:字符串的比较 大小于号
3. 大小与运算符:非字符串的比较
4. 严格相等运算符 ===
5. 严格不相等运算符
6. 相等运算符 ==
7. 不相等运算符

区别是相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值
概述

2. 大小与运算符:字符串的比较 大小于号
字符串按照字典顺序进行比较

3. 大小与运算符:非字符串的比较
如果两个运算子之中,至少有一个不是字符串,需要分成以下两种情况

(1)原始类型值

先转成数值再比较
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

任何值(包括 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’
两个对象之间的比较也是如此。

[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]’

4. 严格相等运算符 ===
如果两个变量引用同一个对象,则它们相等。

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

(4)undefined 和 null

undefined 和 null 与自身严格相等。

undefined === undefined // true
null === null // true
由于变量声明后默认值是 undefined,因此两个只声明未赋值的变量是相等的。

5. 严格不相等运算符
6. 相等运算符 ==

(1)原始类型值

原始类型的值会转换成数值
1 == true // true
// 等同于 1 === Number(true)

0 == false // true
// 等同于 0 === Number(false)

2 == true // false
// 等同于 2 === Number(true)

2 == false // false
// 等同于 2 === Number(false)

‘true’ == true // false
// 等同于 Number(‘true’) === Number(true)
// 等同于 NaN === 1

” == 0 // true
// 等同于 Number(”) === 0
// 等同于 0 === 0

” == false // true
// 等同于 Number(”) === Number(false)
// 等同于 0 === 0

‘1’ == true // true
// 等同于 Number(‘1’) === Number(true)
// 等同于 1 === 1

‘n 123 t’ == 123 // true
// 因为字符串转为数字时,省略前置和后置的空格
(2)对象与原始类型值比较

对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。

// 对象与数值比较时,对象转为数值
[1] == 1 // true
// 等同于 Number([1]) == 1

// 对象与字符串比较时,对象转为字符串
[1] == ‘1’ // true
// 等同于 String([1]) == ‘1’
[1, 2] == ‘1,2’ // true
// 等同于 String([1, 2]) == ‘1,2’

// 对象与布尔值比较时,两边都转为数值
[1] == true // true
// 等同于 Number([1]) == Number(true)
[2] == true // false
// 等同于 Number([2]) == Number(true)

undefined == null // true

(4)相等运算符的缺点

相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

0 == ” // true
0 == ‘0’ // true

2 == true // false
2 == false // false

false == ‘false’ // false
false == ‘0’ // true

false == undefined // false
false == null // false
null == undefined // true

‘ trn ‘ == 0 // true

退出移动版