美文网首页
小插曲-浏览器版本判断

小插曲-浏览器版本判断

作者: coffee_me | 来源:发表于2017-07-13 23:32 被阅读0次

    今天快下班的时候发生了件小事情,但是引起了大动静...
    起因是一个老项目中的浏览设备判断代码中,有一段针对Linux系统的判断,归类于android移动浏览器。
    原本没有什么问题,因为测试不会拿Linux系统来测试这个项目,但是我用无意中发现在Linux中pc浏览器打开项目,会导致被判断为移动端浏览器跳转到移动端,而移动端的判断不把他归于移动类,又跳回到pc端,于是就死循环了。
    核心代码大概如下:

    var browser = {
        versions:function(){
            var u = navigator.userAgent;
            return {
                trident: u.indexOf('Trident') > -1, //IE内核
                presto: u.indexOf('Presto') > -1, //opera内核
                webKit: u.indexOf('AppleWebKit') > -1, //webkit内核
                gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
                mobile: !!u.match(/Mobile/ig), //是否为移动终端
                ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
                android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端
                iPhone: u.indexOf('iPhone') > -1, //是否为iPhone
                iPad: u.indexOf('iPad') > -1, //是否iPad
            } 
        }()
    }
    

    代码中将Linux归类于android,导致了一个死循环,然后我顺手将Linux判断删除,结果一时大意删成了下面这个样子

    android: u.indexOf('Android') > -1 > -1, //android终端
    

    然后运行代码,发现原本只存在于Linux系统中的问题,爆发到所有pc端浏览器来回跳。
    后来仔细查看代码时才发现,多了一个> -1,就是这个导致了android被判定为true,下面来想起解析下:

    u.indexOf('Android') > -1 > -1  // true
    
    //拆解
    u.indexOf('Android') > -1 //显然在pc中会判定为 false
    
    false > -1 // ???
    
    //如果记得没错 js不同类型运算时不同类型会优先转换成number(相加时其中有一方是string优先转换成string)
    false > -1 //会转换成 0 > -1 true
    
    
    //你肯定知道 1 == true  0 == false  那么 -1 == ???
    -1 == true  // false
    -1 == false // false  
    Boolean(-1) // 记得只有5种情况会被转换成false ('',NaN,0,null,undefined) 为什么?去问布兰登
    
    //李云飞来输出一下,这是你的本质
    (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] 
    

    为什么这么简单的内容,我要写出来,因为这个代码被推到线上去了...
    然后,就没有然后了...

    大哥,你公司招人吗?
    资深前端,框架各种6,一个人干3个人的活
    哎~~~大哥,别走啊大哥
    工资好商量...

    相关文章

      网友评论

          本文标题:小插曲-浏览器版本判断

          本文链接:https://www.haomeiwen.com/subject/kcoghxtx.html