小插曲-浏览器版本判断

2017-07-13  本文已影响0人  coffee_me

今天快下班的时候发生了件小事情,但是引起了大动静...
起因是一个老项目中的浏览设备判断代码中,有一段针对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个人的活
哎~~~大哥,别走啊大哥
工资好商量...

上一篇下一篇

猜你喜欢

热点阅读