最短的IE判定方法

标签:JavaScript

以前曾看到过7字节的IE判定方法:
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条评论 你不来一发么↓

    想说点什么呢?