今天快下班的時(shí)候發(fā)生了件小事情慕购,但是引起了大動(dòng)靜...
起因是一個(gè)老項(xiàng)目中的瀏覽設(shè)備判斷代碼中,有一段針對(duì)Linux系統(tǒng)的判斷,歸類于android移動(dòng)瀏覽器峦失。
原本沒有什么問題,因?yàn)闇y試不會(huì)拿Linux系統(tǒng)來測試這個(gè)項(xiàng)目术吗,但是我用無意中發(fā)現(xiàn)在Linux中pc瀏覽器打開項(xiàng)目尉辑,會(huì)導(dǎo)致被判斷為移動(dòng)端瀏覽器跳轉(zhuǎn)到移動(dòng)端,而移動(dòng)端的判斷不把他歸于移動(dòng)類较屿,又跳回到pc端隧魄,于是就死循環(huán)了。
核心代碼大概如下:
var browser = {
versions:function(){
var u = navigator.userAgent;
return {
trident: u.indexOf('Trident') > -1, //IE內(nèi)核
presto: u.indexOf('Presto') > -1, //opera內(nèi)核
webKit: u.indexOf('AppleWebKit') > -1, //webkit內(nèi)核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐內(nèi)核
mobile: !!u.match(/Mobile/ig), //是否為移動(dòng)終端
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
,導(dǎo)致了一個(gè)死循環(huán)隘蝎,然后我順手將Linux判斷刪除购啄,結(jié)果一時(shí)大意刪成了下面這個(gè)樣子
android: u.indexOf('Android') > -1 > -1, //android終端
然后運(yùn)行代碼,發(fā)現(xiàn)原本只存在于Linux系統(tǒng)中的問題嘱么,爆發(fā)到所有pc端瀏覽器來回跳狮含。
后來仔細(xì)查看代碼時(shí)才發(fā)現(xiàn),多了一個(gè)> -1
曼振,就是這個(gè)導(dǎo)致了android
被判定為true辉川,下面來想起解析下:
u.indexOf('Android') > -1 > -1 // true
//拆解
u.indexOf('Android') > -1 //顯然在pc中會(huì)判定為 false
false > -1 // ?拴测?乓旗?
//如果記得沒錯(cuò) js不同類型運(yùn)算時(shí)不同類型會(huì)優(yōu)先轉(zhuǎn)換成number(相加時(shí)其中有一方是string優(yōu)先轉(zhuǎn)換成string)
false > -1 //會(huì)轉(zhuǎn)換成 0 > -1 true
//你肯定知道 1 == true 0 == false 那么 -1 == ?集索?屿愚?
-1 == true // false
-1 == false // false
Boolean(-1) // 記得只有5種情況會(huì)被轉(zhuǎn)換成false ('',NaN,0,null,undefined) 為什么汇跨?去問布蘭登
//李云飛來輸出一下,這是你的本質(zhì)
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]]
為什么這么簡單的內(nèi)容妆距,我要寫出來穷遂,因?yàn)檫@個(gè)代碼被推到線上去了...
然后,就沒有然后了...
大哥娱据,你公司招人嗎蚪黑?
資深前端,框架各種6中剩,一個(gè)人干3個(gè)人的活
哎~~~大哥忌穿,別走啊大哥
工資好商量...