JavaScript相等操作符(==)
两组操作符
相等:==
(先转换再比较)
全等:===
(仅比较不转换)
相等(==
)规则
Boolean规则:Boolean(val):如果有一个操作数是Boolean
值,则在比较前先将其转换为数值——false
为0
,true
为1
。
String&Number规则:Number(string):如果一个是String
,一个是Number
,则先将String
转为Number
。
Object规则:valueOf(obj):如果有一个是对象,则调用valueOf
方法(数组调toString()
方法)。
问题探讨
[] == []; // false
{} == {}; // false
[] == ![]; // true
{} == !{}; // false
[] == []
和{} == {}
是因为引用的对象指向不同的指针,所以不会相等。
一、[] == ![]
- 1:逻辑非(
!
)的优先级高于相等操作符(==
),所以先计算![]
的boolean
值false
,此时比较的是:[] == false
; - 2:根据上面提到的boolean规则,则需要把
false
转成0
,此时比较的是:[] == 0
; - 3:根据上面提到的Object规则,调用空数组的toString方法,即
[].toString()
的值为''
,此时比较的是:'' == 0
; - 4:根据上面提到的String规则,将字符串转为数字,即
Number('')
的值为0
,此时比较的是:0 == 0
。
简化:
[] == ![]
转化:[] == false
转化: [] == 0
转化'' == 0
转化: 0 == 0
。
二、{} == !{}
- 1:先计算
!{}
得到false
,此时比较的是:{} == false
; - 2:调用Booean规则,计算
Boolean({})
得到true
,此时比较的是true == false
。
简化:
{} == !{}
转化:{} == false
转化:true == false
。
种一棵树最早的时间是十年前,其次是现在。