通过正则格式化url查询字符串

看到项目里通过js数组split方法格式化查询字符串的,突发奇想为什么不能用正则呢,性能如何?于是便有了如下代码:

    var url='www.baidu.com?a=123&b=456&c=789&e=dfsdfsdfsdfsdfsdfsdf&f=46545454545454785&g=e23232dsfvdfvdf';
    /**
     * 格式化查询字符串(正则实现)
     * @param url url地址
     * @return {Object}  格式化的json对象
     */
    function formatUrl(url){
       var reg=/(?:[?&]+)([^&]+)=([^&]+)/g;
        var data={};
        function fn(str,pro,value){
            data[decodeURIComponent(pro)]=decodeURIComponent(value);
        }
        url.replace(reg,fn);
        return data;
    }
    /**
     * 格式化查询字符串(数组实现)
     * @param url url地址
     * @return {Object}  格式化的json对象
     */
    function formatUrl2(url){
        url=url.replace(/.*\?/,'');
        var args={},
        items=url.length?url.split("&"):[]
                ,item=null
                ,i=0
                ,len=items.length;
        for(i=0;i<items.length;i++){
            item=items[i].split("=");
            args[decodeURIComponent(item[0])]=decodeURIComponent(item[1]);
        }
        return args;
    }
    var startTime=new Date();
    for(var i=0;i<1000000;i++){
        formatUrl2(url);
    }
   console.log('formatUrl2',(new Date()-startTime));  //formatUrl2 12138
   startTime=new Date();
   for(var i=0;i<1000000;i++){
       formatUrl(url);
   }
   console.log('formatUrl',(new Date()-startTime));  //formatUrl 12537

测试浏览器是chrme 25;正则实现的函数居然比数组实现的函数要慢(泪奔....)。不过还好,在重复执行一百万次的情况下只慢0.4秒。。。

posted @ 2012-12-28 17:47  静水渊  阅读(1854)  评论(1编辑  收藏  举报