注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学会珍惜

You've been saying for the longest time

 
 
 

日志

 
 

最短的IE判断:!-[1,]  

2012-12-12 17:59:54|  分类: 前端开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

写在前面:

      虽然现在多数情况徘徊在能力检测、怪癖检测和用户代理检测之间,不过对!-[1]如此有意义的做法必须记下,以向它的发明者致敬。

— 听歌                  

2012年12月12日


转自:未来记忆

最短的IE判断:!-[1,]

已经不记得在什么时候第一次看到这个了,不过当时仿佛是眼前一亮,随之而来的便是疑惑,短短的六个字符,就能辩明“真伪”。

自己在网上也搜索过,不过都不是很详细,只是大概地说了下是利用IE与其它浏览器在创建数组时所存在的一些差异。

这些天一直在翻阅《Javascript高级程序设计(第二版)》,有所收获,看到Array类型,随之便豁然开朗啦。

首先说下IE与其它浏览器在创建数组时的差异:

var names = ["mao","wei","guo",];

就对于上面的语句,在IE中,会认为数组的长度为4,最后一项为"undefined";而在其它浏览器中,会忽略逗号后的,长度为3。

而前面的一元减操作符,其实用一元加操作符效果也一样,即:!+[1,]。

因为Array类型不属于JS中的5种基本数据类型,为复杂数据类型,即Object类型。所以一元减操作符在应用于该类型时会先调用该对象的valueOf()方法,如果返回为NaN,则调用toString()方法。

在Array类型中,valueOf()方法与toString()方法返回结果一样,为数组中各项值的字符串形式拼接而成的一个以逗号分隔的字符串。如上例中:

alert(names.toString());  //mao,wei,guo alert(names.valueOf());   //mao,wei,guo

但是,就在这里,IE的问题就来了:

如果在IE里运行,结果绝对是不一样的。因为前面提到,IE对于上例的数组会认为长度是4,即数组为 ["mao","wei","guo","undefined"],而在Array数组的valueOf()和toString()方法中,若数组项中存 在undefined或null,则返回一个空字符。所以IE中的结果会是:

alert(names.toString());    //IE中的结果,注意最后逗号后面还有个空字符   mao,wei,guo,

了解了这些,那!-[1,]也就好理解了。

-[1,],到这一步,IE中的结果会是NaN;其它浏览器的结果则为-1。

再加上布尔操作符!,便分别返回不同的true 和 false。就这样,OVER了。

最后贴上应用:

var mygoare = {}; 

mygoare.ie = !-[1,]; 

if(mygoare.ie){  

alert("童鞋,这是IE呀!"); 

}else{  

alert("非IE,推荐用chrome,谁用谁知道!"); 

}


  评论这张
 
阅读(122)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017