JavaScript 判断相等的运算符分红相等运算符(==)和全等运算符(===),彷佛==
和===
并无统一的翻译,且把它们分红"相等"和"全等"好了。javascript
判断是否全等的规则:java
若是操做数类型不一样,那么不全等。数组
若是两者都是null
, 全等。翻译
若是都是undefined
, 全等。code
若是其中之一为NaN
, 不全等。对象
若是两者都为true
或false
, 全等。ip
若是都为数值且值相等,全等。字符串
若是都为字符串,且值相等,全等。get
若是都指向同一个引用类型,全等。it
其余状况,不全等。
// 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
,类型相同,转成全等比较。
类型相同,但值不一样,因此不全等。
不相等。
初看上去,内容很是的繁杂,可是若是碰到的时候就来查一下,很快就能有肌肉记忆了。