1、undefined == null // true
这个奇葩我也不知道为什么就相等了。毕竟在进行类型转换的时候都是转换为数字,undefined
转换为数字是 NaN
,null
转换为数字是0
2、null == 0 // false
null
有属于自己的类型 Null
,而不属于Object
类型,typeof
之所以会判定为 Object
类型,是因为JavaScript
数据类型在底层都是以二进制的形式表示的,二进制的前三位为0 会被 typeof 判断为对象类型
,而null 的二进制位恰好都是 0
,因此,null 被误判断为 Object 类型。
因为null
在JS 渲染引擎里面是转换为 object
对象,对象转换为原始类型使用的是 toString()
或者是 valueOf()
,但是null
没有 toString()和 valueOf()
,所以没办法用下面的方法进行转换,具体为什么,我也不是很清楚。知道的话告诉我一下。
- 对象转换成字符串 的过程
- 如果对象具有
toString()
方法,则调用这个方法,如果返回一个原始值,Javascript
将这个值转换为字符串,并返回这个字符串结果。 - 如果对象没有
toString()
,或者这个方法并不返回一个原始值,那么JavaScript
会调用valueOf()方法
,如果存在这个方法,则JS 会调用它,如果返回值是原始值,javaScript
将这个值转换为字符串,并返回这个字符串的结果。 - 否则,
javascript
无法从toString()或valueOf()
获得一个原始值,因此这时它将抛出一个类型错误异常。
- 如果对象具有
- 对象转换为数字 的过程
- 它会首先尝试使用valueOf()
方法:
- 如果对象具有valueOf()
方法,后者返回一个原始值,则javaScript
将这个原始值转换为数字并返回数字
- 如果对象具有toString()方法
,后者返回一个原始值,则JavaScript
将其转换并返回。(对象的toString()
方法返回一个字符串直接量,JS将字符串转换为数字类型,并返回这个数字)
3、undefined == false // false
- 需要注意的是: 一个值转换为另一个值并不意味着两个值相等。比如,入股在期望使用布尔值的地方使用
undefined
它将会转换为false
,但这不表明undefined == false
。 if语句将undefined
转换为false
,但==
运算符并不试图将其操作数转换为布尔值。!!!
4、包装类与原始值
- JS会在必要时将包装类转换为原始值, ”==“ 运算符将原始值和其包装类对象视为相等,但是 “===” 全等于运算符将他们视为不等,因为 通过
typeof
可以看到原始值和其包装类的不同。。