原文链接: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
果然,我是小菜鸡呢,一开始就忘记了a是个对象啊,想当然的就以为可以直接a.i进行比较了;忽略了是对象比较,而不是对象的属性进行比较。。。。。