TokenYangForever / NewProject

0 stars 0 forks source link

(a== 1 && a ==2 && a==3)可能为true吗? #23

Closed TokenYangForever closed 6 years ago

TokenYangForever commented 6 years ago

前言

if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); } // 输出Hello World!

* 这里说下具体的过程:执行`a==1`时,js引擎会尝试把对象类型a转化为数字类型,首先调用a的valueOf方法来判断,不行则继续调用toString方法,然后再把toString返回的字符串转化为数字类型再去和a作比较(这里我重写了toString就直接返回的数字类型的结果,正常情况toString返回的字符串)。
* 所以每一次使用`==`判断都会调用一次a的toString方法,返回i属性的值,然后使a的i属性加1,这样最后的判断结果自然就为true了。
* 其实重写valueOf方法也可以实现,而且转化时会优先调用valueOf方法:

var c = { toString () { console.log('toString') }, valueOf () { console.log('valueOf') } } c == 1 // console输出'valueOf'


#### 结语
* 这个问题看起来是解决了,但其实在实际项目中去重写原生对象的`toString`或`valueOf`方法是很不应该的,比如`toString`本来是一定会返回一个字符串结果的,重写后返回其他类型反而容易出问题。