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