==

  • (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去做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上下文环境中,会对valueboolean的类型转换.我们知道,有几种情况是false +0,-0, null, undefined, NaN, ''

Last updated