JavaScript 判断相等的运算符分成相等运算符(==)和全等运算符(===),似乎==
和===
并没有统一的翻译,且把它们分成"相等"和"全等"好了。
全等运算符
判断是否全等的规则:
如果操作数类型不同,那么不全等。
如果二者都是
null
, 全等。如果都是
undefined
, 全等。如果其中之一为
NaN
, 不全等。如果二者都为
true
或false
, 全等。如果都为数值且值相等,全等。
如果都为字符串,且值相等,全等。
如果都指向同一个引用类型,全等。
其他情况,不全等。
举例
// false, 类型不同#1
1 === '1'
// fasle, #4
NaN === NaN
// false, 虽然都是空对象,但不是同一个引用类型值
[] === []
// true, 同一个引用类型值
var firstObject = {}
var secondObject = firstObject
secondObject['name'] = 'Neo'
secondObject === firstObject
引用类型转换成基本类型
在之前的加法运算符里面也提到过引用类型到基本类型的转换,过程大致如下:
先调用
valueOf
方法,如果返回的是基本类型值,转换结束。如果失败了,就调用
toString
方法。如果返回基本类型值,转换结束。否则,抛出错误:
TypeError: Cannot convert object to primitive value
大多数的原生对象在调用valueOf
方法的时候都会返回对象自身,所以大多数时候其实都会调用toString
方法。
Date
对象比较特殊,它的valueOf
方法返回的是毫秒数,在转换成基本类型值的时候直接调用toString
方法。
相等运算符
判断是否相等的规则:
如果操作数类型一致,且满足全等的条件,则相等,否则不相等。
-
如果操作数类型不一致:
如果一个是
null
, 另一个是undefined
, 相等。如果一个是数字,另一个是字符串,把字符串转换成数字再比较。
如果一个是布尔值,把
true
转成1,false
转成0, 然后再比较。如果一个是对象,另一个是数字或者字符串,把对象转成基本类型值再比较。
其他情况,不相等。
举例
1 == true // true
根据条件2.3,把
true
转成1。然后两个操作数类型一致,满足条件1,使用全等比较。
都为数值且相等,全等。
相等。
'' == 0 // true
根据2.2,把
''
转换成数字,即0。然后两个操作数类型一致,满足条件1,使用全等比较。
都为数值且相等,全等。
相等。
null == 0 // false
条件3,属于其他情况,不相等。
null == undefined
条件2.1,相等。
NaN == NaN // false
类型一致,转换成全等比较
NaN === NaN 不成立,因此不全等
所以不相等
[''] == '' // true
条件2.4,先把数组转换成基本类型
比较
'' == ''
,类型相同,转成全等比较类型相同,且值相同,全等。
相等。
{} == true // false
true
转换成1,然后对象转换成基本类型值,即"[object Object]" == 1
条件2.2,把字符串转换成数字,得到
NaN == 1
,类型相同,转成全等比较。类型相同,但值不同,所以不全等。
不相等。
初看上去,内容非常的繁杂,但是如果碰到的时候就来查一下,很快就能有肌肉记忆了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。