!+"\v1" & !+[1,] & !"1"[0] 比比谁更快

    下面所做的可能有点鸡蛋里跳骨头的味道,但却也十分有趣,希望各位能够在看了之后能够有所收获.

    总所周知,浏览器兼容问题一直困扰着开发者们,勤劳的开发者们也想到了各式各样的小技巧来区分各个派系的浏览器.

    !+"\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  (需FQ)
    连接2: 转义字符_百度百科 -- http://baike.baidu.com/view/73.html
    连接3: JavaScript类型转换 -- http://www.cnblogs.com/dreampuf/archive/2009/01/22/1380075.html

posted @ 2010-02-02 04:02  Dreampuf  阅读(2007)  评论(9编辑  收藏  举报