zoukankan      html  css  js  c++  java
  • 如何让(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

  • 相关阅读:
    20159320《网络攻防实践》第7周教材总结
    20159320《网络攻防实践》第7周视频总结
    20159320《网络攻防实践》第7周学习总结
    软件中反跟踪技术和软件调试
    20159320《网络攻防实践》第6周学习总结
    20159320《网络攻防实践》第6周教材总结
    20159320《网络攻防实践》第6周视频总结
    20159318 《网络攻防实践》第6周学习总结
    20159318 《网络攻击与防范》第5周学习总结
    20159318《网络攻防技术与实践》第4周学习总结
  • 原文地址:https://www.cnblogs.com/ygunoil/p/12124463.html
Copyright © 2011-2022 走看看