通过正则格式化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秒