原文链接: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