最短的IE判定方法
2010 1 29 04:58 PM 1420次查看
分类:JavaScript 标签:JavaScript
var ie = !+"\v1";
if (+"\v1")
alert("这不是IE浏览器!");
else
alert("这是IE浏览器!");
原理就是JavaScript是弱类型语言,+"\v1"这个求值会隐私转变成将"\v1"转化成一个数。标准的浏览器会把垂直制表符\v当成空白来处理,于是就得到+1;而IE不将\v识别为空白,于是"\v1"无法转成一个数,就变成NaN了。
而1的bool值为true,NaN的bool值为false,这就将IE与其他浏览器区分开了。
今天又在Ruby's Louvre看到一个6字节的判定方法:
var ie = !-[1,];
if (-[1,])
alert("这不是IE浏览器!");
else
alert("这是IE浏览器!");
这同样也是利用了IE的bug。首先看[1,],标准浏览器会认为它只有1个元素,即[1];而IE会认为它有2个元素,即[1, undefined]。
而用-号求值时,[1]会被转换成1,于是得到-1;而-[1, undefined]则不是一个数,于是得到NaN。
最终也和之前一样区分开了。
虽说这是IE的bug,但如果不是JavaScript的隐式转换,这bug也不会存在。
毕竟对适应了强类型语言的人而言,+"\v1"等于1,而-[1,]等于-1,这可是怎么都想不通的。
顺便再从酷壳转个表,看到它就不难理解Javascript程序员为什么痛苦了:
'' == '0' //false
0 == '' //true
0 == '0' //true
false == 'false' //false
false == '0' //true
false == undefined //false
false == null //false
null == undefined //true
" \t\r\n" == 0 //true
所以我觉得,JavaScript作为一门灵活的动态语言是成功的(能够方便地操作DOM元素),作为一门动态类型语言还算是高效的(与Python、Ruby相比),但作为一门弱类型语言却是非常危险和充满陷阱的。
0条评论 你不来一发么↓