> For the complete documentation index, see [llms.txt](https://xiaohesong.gitbook.io/today-i-learn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaohesong.gitbook.io/today-i-learn/front-end/undefined.md).

# ==

* (a == 1 && a == 2 && a == 3)

`a`可以那么玩吗?可以.

```javascript
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

```javascript
if(3){console.log("true")}
true == 3 // return false
```

上述例子中出现的情况,你可能知道结果是`false`,可是这是为什么?

这个还是得说说`==`的对比.我们知道他是强制类型转换,可是他是怎么转换的.

上面有说到 `==`会检查类型,如果类型不同会做类型转换,那是如何转换.

其实[你看标准里说的](http://www.ecma-international.org/ecma-262/#sec-abstract-equality-comparison),就知道了.

如果是一个`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, ''`
