如何让(a==1&&a==2&&a==3)成立

原文链接:https://www.jianshu.com/p/b7831b06f61a

上班摸鱼的时候,刷到了一篇很有意思的文章,可以先看看上面的链接;

对于我这种小白来说,这种判断条件,似乎,好像,可能,大概不成立吧。然后我仔细看了看(第一种方法),

第一遍,嗯?这是什么操作???

第二遍,哦!原来是这样(ps:我去翻书了--javaScript高级教程   相等操作符那一节)

ok,弄明白了,就是把a当对象,重写相等运算符比较之前进行的类型转换方法---toString

等等,toString ????  书上明明写的对象转换类型,调用的是valueof() 啊;

实践出真知,当然敲代码才能弄明白了

1、先敲了一遍网上的代码↵

window.onload=function(){
var a = {
i:1,

toString:function(){
console.log('toString')
return a.i++
}
}

if(a==1&&a==2&&a==3){
console.log('true')
}else{
console.log(false)
}
}


控制台输出

嗯,果然是大佬,代码完全没问题呢,成功得到了true;那么,难道是书本错了,其实是调用toString()的转换方法?于是,我又敲了一次代码

2、把toString() 换成valueOf()    (๑•̀ㅂ•́)و✧

window.onload=function(){
var a = {
i:1,
valueOf:function(){
console.log('valueOf')
return a.i++
}
}

if(a==1&&a==2&&a==3){
console.log('true')
}else{
console.log(false)
}
}


控制台输出

哦吼!!!!也成功了 !!! 

等等,我高兴个什么劲啊,为什么都成功了啊

于是,我进行了第三步操作

3、同时重写方法,看调用哪个

window.onload=function(){
var a = {
i:1,
valueOf:function(){
console.log('valueOf')
return a.i++
},
toString:function(){
console.log('toString')
return a.i++
}
}

if(a==1&&a==2&&a==3){
console.log('true')
}else{
console.log(false)
}
}


控制台输出

emm,很明显了,都被重写的情况下,调用了valueOf() ,说明书本没错,调用的是对象的valueOf()方法,转换位数值类型

但是,为什么呢?(°ー°〃)

为什么,只重写toString()的时候,调用了呢

深思熟虑。。。。。

于是,我又写了一份代码,删除了所有重写方法

window.onload=function(){
var a = {
i:1
}

if(a==1&&a==2&&a==3){
console.log('true')
}else{
console.log(false)
}
}


控制台输出

似乎还是有点迷?

ok,再加一条代码

window.onload=function(){
var a = {
i:1
}
console.log(a.valueOf())
console.log(a.toString())
if(a==1&&a==2&&a==3){
console.log('true')
}else{
console.log(false)
}
}


控制台输出

然后,我在书上翻到了这么一段话

ok,一切都说得通了,因为a本身定义的是对象,所以像调用了valueOf进行数值比较,发现返回的值并不能转换为数值,所以调用了toString方法,得到了[Object Object],很熟悉吧,对象转数值的结果,所以对比后得到了false

但是因为我们重写了valueOf和toString 方法,方法有了数值类型的返回值,所以==得到了正确的比较结果,返回了true;

而且因为valueOf转换在toString之前,所以比较完成之后就不再调用toString了;

而因为默认valueOf得到的值并不能进行比较,所以调用了重写后toString方法;

完全ojbk(* ̄▽ ̄*)o
————————————————
版权声明:本文为CSDN博主「并檐私耳语」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/github_39371177/article/details/95450685

原文地址:https://www.cnblogs.com/ygunoil/p/12124463.html