# 7、前端URL参数获取(3种方法)

# 1、纯字符串方法截取URL问号传参以及哈希值处理

function mystringURL(url) {
	var obj={}, wellIndex=url.indexOf('#'),askIndex= url.indexOf("?");
  //如果没有传参也没有哈希值则直接返回obj;
  if (askIndex === -1 && wellIndex === -1) return obj;
  //先处理哈希值如果有直接存入obj中,如果没有则把'#'号的长度改为字符串的长度(后面要用);
  wellIndex>-1 ? obj.hash = url.slice(wellIndex + 1) : wellIndex=url.length;
  //如果没有问号传参直接返回obj;
  if (askIndex === -1) return obj;
  //接下来是有问号传参的处理:截取字符串并拆分为数组
  var ary= url.slice(askIndex + 1, wellIndex).split(/&|=/g);
  for (var i = 0; i < ary.length; i += 2) {
  obj[ary[i]] = ary[i + 1];
  }
  return obj;
}

# 2、正则方法截取URL问号传参以及哈希值处理(最简单)

// 1、以一个方法的形式实现
function myRegExpURL(url) {
  var obj = {},wellIndex=url.indexOf('#');
  //有哈希值的处理:正则方法直接将'#'替换为'&hash=',方便后面的替换
  wellIndex > -1 ? url = url.replace(/#/, '&hash=') : null;
  //没有传参的话只把哈希属性加入obj,传递了参数的话每个属性都加入;
  let reg=/[?&]([^?&=]+)(?:=([^?&=]*))?/g;
  url.replace(reg, function () {
    obj[arguments[1]] = arguments[2];
  })
  return obj;
}

//  2、直接扩展到String的原型上
//  往原型上扩展的时候要注意this的问题
String.prototype.myQueryURLParameter=function () {
  //由于this不能直接赋值,所以要定义一个变量接收一下;
  let obj={},that=this,wellIndex=this.indexOf('#');
  wellIndex>-1?that=this.replace(/#/,'&hash='):null;
  let reg=/[?&]([^?=&]+)(?:=([^?&=]*))?/g;
  that.replace(reg,function () {
      obj[arguments[1]]=arguments[2];
  });
  return obj;
};
let str='http://item.taobao.com/item.html?a=1&b=2&c=&d=xxx&e#teacher';

/* 处理后得到结果:
{a: "1", b: "2", c: "", d: "xxx", e: undefined, hash:"teacher"}
如何使用:
第一种方法:let val=myRegExpURL(str);
第二种方法:let val=str.myQueryURLParameter();
两个val的结果都是:{a: "1", b: "2", c: "", d: "xxx", e: undefined, hash:"teacher"} 
*/

# 3、动态创建a标签法处理URL问号传参以及哈希值处理

function myAURL(url) {
	//动态创建a标签并将url赋值给a标签的href属性
	var link = document.createElement('a'),
		obj = {};
	link.href = url;
	var hash=link.hash.slice(1),search = link.search.slice(1);
	//先处理是否有哈希值有的话直接加入
	hash.length>0?obj.hash=hash:null;
	//判断是否有问号传参(利用a标签的search属性可直接获取'?'以及后面的参数),长度为0直接返回obj;
	if(search.length===0)return obj;
		//截取字符串并按正则拆分为数组
	search=search.split(/&|=/g);
	//循环拆分后的数组然后添加到属性名中,
	for (var i = 0; i < search.length; i+=2) {
  obj[search[i]]=search[i+1];
  }
  link = null;
  return obj;
}

# 面试题

var str='http://item.taobao.com/item.html?a=1&b=2&c=&d=xxx&e#teacher';
// 处理后得到结果:
{a: "1", b: "2", c: "", d: "xxx", e: undefined, hash:"teacher"}


// 正则处理实现
function urlRegExp(url) {
  var obj={},wellIndex=url.indexOf('#');
  //单独处理哈希值
  wellIndex>-1?url=url.replace(/#/,'&hash='):null;
  let reg=/[?&]([^?&=]+)(?:=([^?&=]*))?/g;
  url.replace(reg,function () {
      obj[arguments[1]]=arguments[2];
  });
  return obj;
}


// 字符串截取实现
function strUrl(url) {
  let obj={},wellIndex=url.indexOf('#');
  //单独处理哈希值
  wellIndex>-1?url=url.replace('#','&hash='):null;
  let [,para]=url.split('?'),
  paraAry=para.split('&');
  for (let i = 0; i < paraAry.length; i++) {
    let ary=paraAry[i].split('=');
    obj[ary[0]]=ary[1];
  }
  return obj;
}
console.log(urlRegExp(str));
console.log(strUrl(str));
上次更新: 5/14/2020, 7:08:06 PM