==
(a == 1 && a == 2 && a == 3)
a可以那么玩吗?可以.
a = {
num: 0,
valueOf: function(){
return this.num += 1
}
}
console.log(a == 1 && a == 2 && a == 3) // true如果第一眼看到,是不是很惊讶.这是为什么?
因为在==对比的时候,他是先进行对比类型,如果类型不同,便会做强制类型转换.在做类型转换的过程中,会优先调用 valueOf.
==对比的时候,他是先进行对比类型,如果类型不同,便会做强制类型转换.在做类型转换的过程中,会优先调用 valueOf.valueOf默认会返回当前对象,但是这可以允许你去覆盖他,返回其他的东西,上例中就是这样.
所以每对比一次都会调用valueOf去做this.num += 1.
if(a){console.log(true)}, a == 3 return false
if(3){console.log("true")}
true == 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