URL(统一资源定位符)是Web开发中经常用到的东西,它由很多部分组成。
protocol+host+port(默认80)+pathname+search+hash
假如有一个URL:
http://www.kittencup.com/wp-login.php?username=final&password=123456
现在我想获取对应的usename值和password值。
那在js中如何实现呢?

var username = location.search.slice(1).split('&')[0].split('=')[1];
var password = location.search.slice(1).split('&')[1].split('=')[1];

实现原理:字符串与数组的相互转化。
这种写法的优点是:简单粗暴,非常适合代码洁癖者;缺点是:得知道参数顺序,不利于变动。

var arr = location.search.slice(1).split('&');
for(var i=0,obj={},temp=[];i<arr.length;i++){
temp=arr[i].split('=');
obj[temp[0]]=temp[1];
}
console.log(obj);
Object {username: "final", password: 123456}

实现原理:字符串、数组、对象的相互转化。
temp是我们临时创建的一个数组,temp[0]是key,temp[1]是value。
我们把key传入对象obj中,key是对象的属性,value是对象属性对应的值。
为何要以[]的方式传入,而不是我们通常所用的.方式呢?
因为每次循环时,temp[0]都是一个实际的值(譬如”username”,”password”),
而obj.”username”显然会报错。
obj.的后面必须跟着形参,而obj[]里必须是实参。
我们把上面的代码封装成一个函数,方便我们复用代码。

function getParams(){
var arr = location.search.slice(1).split('&');
for(var i=0,obj={},temp=[];i<arr.length;i++){
temp=arr[i].split('=');
obj[temp[0]]=temp[1];
}
return obj;
}
console.log(getParams().username);
console.log(getParams().password);

再回头来review下代码,是否可以让这个函数的应用范围更广?
location显然是window的属性,这就直接限制了这个函数只能用来解析当前地址栏URL。
如果只是让我解析一段URL,并不一定是当前地址栏URL呢?
譬如在后端(譬如node),都可以通过请求头中的href获取到URL。
而后端中显然没有BOM(也就是没有window),
所以我们可以改造下这个函数,让其不仅应用在前端,也应用在后端。

function getParams(url){
var start = url.indexOf('?')+1;
var end = url.indexOf('#') || null;
var arr = url.slice(start,end).split('&');
for(var i=0,obj={},temp=[];i<arr.length;i++){
temp=arr[i].split('=');
obj[temp[0]]=temp[1];
}
return obj;
}
console.log(getParams(location.href).username);

至此,getParams(url)方法的参数url既可以是location.href,也可以是任意url。
没看过node.js中URL模块的源码,但获取参数部分的代码与上面应该大同小异。