共计 2106 个字符,预计需要花费 6 分钟才能阅读完成。
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