相等
一、认识
等于运算符==
检查其两个操作数是否相等,并返回Boolean
结果。比较期间会尝试强制类型转换并且比较不同类型的操作数。
二、语法
三、规则
相等运算符==
使用抽象相等比较算法比较两个操作数(强制类型转换)逻辑如下:
-
如果两个操作数都是对象,则仅当两个操作数都引用同一个对象时才返回
true
-
如果一个操作数是
null
,另一个操作数是undefined
,则返回true
-
如果两个操作数是不同类型的,就会尝试在比较之前将它们转换为相同类型
-
当数字与字符串进行比较时,会尝试将字符串转换为数字值
-
如果操作数之一是
Boolean
,则将布尔操作数转换为1
或0
- 如果是
true
,则转换为1
- 如果是
false
,则转换为0
- 如果是
-
如果操作数之一是对象,另一个是数字或字符串,会尝试使用对象的
valueOf()
和toString()
方法将对象转换为原始值
-
-
如果操作数具有相同的类型,则将它们进行如下比较
-
String
:true
仅当两个操作数具有相同顺序的相同字符时才返回。 -
Number
:true
仅当两个操作数具有相同的值时才返回。+0并被-0视为相同的值。如果任一操作数为NaN
,则返回false
。 -
Boolean
:true
仅当操作数为两个true
或两个false
时才返回true
。
-
四、问题
4.1 null >= null
为什么是 true
?
检验
console.log(null >= null) // true
原因
>=
大于等于操作符,要求两边必须为数值类型,所以要对null
强制类型转换,内部执行ToNumber(null)
输出0
, 所以最后的表达式为null >= null
可以转化为 0 >= 0
, 结果为 true
4.2 undefined >= undefined
为什么是 false
?
检验
console.log(undefined >= undefined) // false
原因
>=
大于等于操作符,要求两边必须为数值类型,所以要对undefined
强制类型转换,内部执行ToNumber(undefined)
输出NaN
, 所以最后的表达式为undefined >= undefined
可以转化为 NaN >= NaN
, 由于 NaN
不大于、等于、小于任何值,所以结果为false
4.3 [] == ![] 为什么是 true?
检验
console.log([] == ![]) // true
原因
-
==
等于操作符,要求两边必须为数值类型,![]
将数据类型转化为Boolean
类型false
, 继续将Boolean
转化为了Number
类型0
-
此时
==
有一边为Number
类型,那么另一边[]
要强制转换Number
,调用ToNumber([])
-
ToPrimitive
内部会调用ToPrimitive([],Number)
-
ToPrimitive([],Number)
内部首先执行[].valueOf()
结果为引用类型的 []
不为原始数据类型,继续调用[].toString()
结果为空字符串
-
得到的空字符串继续执行
ToNumber("")
结果为0
-
因此
[] == ![]
可以转化为0 == 0
, 所以结果为true