下面所做的可能有点鸡蛋里跳骨头的味道,但却也十分有趣,希望各位能够在看了之后能够有所收获.
总所周知,浏览器兼容问题一直困扰着开发者们,勤劳的开发者们也想到了各式各样的小技巧来区分各个派系的浏览器.
!+"\v1"
这是在园子里的司徒正美童鞋那看到的,第一眼就被震惊了,原来判断可以这样的精悍.
以下是个人的理解,出处文尾连接1.
这是一个JavaScript类型转换的技巧,按照优先级,这里是从右往左(+ 取正> ! 逻辑求负).也就是将字符串"\v1"转换为数字后再求反.数字求反很好理解,只要不是0的都是true,然后 + 取正对字符串进行了转换,转换为数字.然后IE在这里就出现了歧义,错误的理解了转义符"\v",垂直制表符,关于制表符在文尾连接2有 更多的解释.在其他浏览器中能够正确解释这个制表符,IE则将这个制表符解释成了字母"v",这个当然无法转换成数字,自然转换NaN,按照逻辑操作符的 转换规则,转换为了false,再一个求反,则变成了true,趾高气昂的说,"我是IE,没错,TRUE!".
!+[1,]
同样是在司徒童鞋那看到的,天天逛园子的收货果然不少啊,关于这个判断语句的解释请移步司 徒正美--全 世界最短的IE判定 .
不过在接下来的测试中,你会发现,这条最短的语句不一定是最快的.
!"1"[0]
这个是我翻看Ext源代码时发现的,在Ext.toArray的注释里作者告诉了IE无法使用数组下标访问字符串,这不就又可以分辨了么.
就是这个方法,IE中无法以数组下标的方式访问字符串,在Ext的注释中提示可以使用"abc".match(/./g)的方式,我就纳闷了怎么直接使用 原生的split方法,"abc".split(""),很明显的更直观,而且免去了一个正则的构造.
这个方法在FF下的效率已经超过了IE.
注:经司徒指证,此方法不通用.具体返回可看留言
| IE8 |
| 判断语句 |
三次测试 |
平均值 |
| !+"\v1" |
3776 |
3682 |
3681 |
3713 |
| !+[1,] |
58422 |
56519 |
56581 |
57174 |
| !"1"[0] |
5445 |
5554 |
5507 |
5502 |
| !window.addEventListener |
23045 |
22825 |
22908 |
22926 |
| window.attachEvent |
29419 |
29450 |
29556 |
29475 |
| document.all |
44553 |
44647 |
44835 |
44678 |
| |
| FireFox3.6 |
| !+"\v1" |
1425 |
1428 |
1425 |
1426 |
| !+[1,] |
12627 |
12478 |
12560 |
12555 |
| !"1"[0] |
125 |
140 |
126 |
130 |
| !window.addEventListener |
27236 |
25530 |
25556 |
26107 |
| window.attachEvent |
77590 |
79494 |
77347 |
78143 |
| document.all |
22877 |
22984 |
22978 |
22946 |
测试环境 CPU : E2180(2.0GHz),RAM 2G.OS : Win7

测试代码
var i = 0, total = 10000000, btimespan, p1timespan, p2timespan;
var Bstart = new Date();
for(;i < total; i++) {
if(/*测试语句*/) ;
}
btimespan = new Date().getTime() - Bstart.getTime();
i = 0;
var P1start = new Date();
for(; i < total; i++) {
if(/*测试语句*/) ;
}
p1timespan = new Date().getTime() - P1start.getTime();
连接1: 32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is IE -- http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html (需翻墙)
连接2: 转义字符_百度百科 -- http://baike.baidu.com/view/73.html
连接3: JavaScript类型转换 -- http://www.cnblogs.com/dreampuf/archive/2009/01/22/1380075.html