您好,欢迎访问一九零五行业门户网

最短的IE判断var ie=!-[1,]分析_javascript技巧

以前最短的ie判定借助于ie不支持垂直制表符的特性搞出来的。
复制代码 代码如下:
var ie = !+\v1;
仅仅需要7bytes!参见这篇文章,《32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is ie》,讲述外国人是如何把ie的判定从32 bytes一步步缩简成7 bytes!的故事但这纪录今年1月8日被一个俄国人打破了,现在只要6 bytes!它利用了ie与标准浏览器在处理数组的tostring方法的差异做成的。对于标准游览器,如果数组里面最后一个字符为逗号,js引擎会自动剔除它。
复制代码 代码如下:
var ie = !-[1,];
这句代码在ie9之前曾被称为世界上最短的ie判定代码。代码虽短但确包含了不少javascript基础知识在里面。在这个例子中代码执行时会先调用数组的tostring()方法 ,执行[1,].tostring()在ie6,7,8中将会得到1,。然后表达式就变为!-1,。再尝试把1,转换成数值类型得到nan ,再对nan取负得到值仍为nan。最后执行!nan返回true。下面通过分解这个语句来回顾下代码中所涉及到的javascript知识:
1. 浏览器的数组字面量解析差异
[1,]表示使用javascript的数组字面量定义了一个数组。 在ie6,7,8中数组有两个元素,数组中的值分别为1,undefined。在标准的浏览器中会忽略第一个元素后的undefined,数组只包含一个元素1。
2. 数组的tostring()方法
调用数组对象的tostring()方法时会对数组中的每个元素调用tostring()方法,如果元素的值为null或者undefined时会返回空的字符串,然后将得到的每项的值拼成一个使用 逗号,分隔的字符串。
3. 一元减号运算符
使用一元减号运算符时如果运算数是数值类型则直接对运算数取负,否则会先尝试把运算数转换为数值类型,转换过程相当于执行number函数,然后再对得到的结果取负。
4. 逻辑非运算
执行逻辑非运算时如果操作数为nan、null或undefined 时返回 true。
javascript可以这么写:
复制代码 代码如下:
var ie = !-[1,];  
   alert(ie);
如果从非ie的角度判定,可以省一个比特,因为我们做兼容时,绝大多数情况都是ie与非ie地开工。 var notie = -[1,];
复制代码 代码如下:
if(-[1,]){ 
     alert(这不是ie浏览器!); 
}else{ 
     alert(这是ie浏览器!); 
}
通过上面的知识可以得出代码 var ie = !-[1,]; 其实等价于 var ie = !(-number([1,].tostring())); 在ie6\7\8中值为true。
因为ie6/7/8都不会忽略[1,].tostring()这个bug,即得到的是1,;而-number([1,].tostring())即为-number(1,)得到的结果是nan;然后!(-number([1,].tostring()))即为!(nan)即得到true。一切的前提是ie6/7/8都有[1,].tostring()=>1,这个bug,而其它浏览器(应该是大部分吧~~)则是[1,].tostring()=>1。
最近发现有朋友这样使用用来提示用户升级浏览器

其它类似信息

推荐信息