==
(a == 1 && a == 2 && a == 3)
a
可以那么玩吗?可以.
如果第一眼看到,是不是很惊讶.这是为什么?
因为在==
对比的时候,他是先进行对比类型,如果类型不同,便会做强制类型转换.在做类型转换的过程中,会优先调用 valueOf
.
==
对比的时候,他是先进行对比类型,如果类型不同,便会做强制类型转换.在做类型转换的过程中,会优先调用 valueOf
.valueOf默认会返回当前对象,但是这可以允许你去覆盖他,返回其他的东西,上例中就是这样.
所以每对比一次都会调用valueOf
去做this.num += 1
.
if(a){console.log(true)}, a == 3 return false
上述例子中出现的情况,你可能知道结果是false
,可是这是为什么?
这个还是得说说==
的对比.我们知道他是强制类型转换,可是他是怎么转换的.
上面有说到 ==
会检查类型,如果类型不同会做类型转换,那是如何转换.
其实你看标准里说的,就知道了.
如果是一个boolean
类型和一个number
类型比较,他会把boolean
转换成number
之后再去比较. 我们知道true == 1
&& false == 0
. 所以true == 3
变成了 1 == 3
,显然是错误的.
可是为什么if(3){console.log(true)}
这样却是可以的呢?
因为在一个boolean
上下文环境中,会对value
做boolean
的类型转换.我们知道,有几种情况是false
+0,-0, null, undefined, NaN, ''
Last updated