题目描述
获取 url 中的参数
- 指定参数名称,返回该参数的值 或者 空字符串
- 不指定参数名称,返回全部的参数对象 或者 {}
- 如果存在多个同名参数,则返回数组
输入例子:
getUrlParam('http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe', 'key')
输出例子:
[1, 2, 3]
方法
function getUrlParam(sUrl,sKey){
var result = {};
sUrl.replace(/\??(\w+)=(\w+)&?/g,function(a,k,v){
if(result[k] !== void 0){
var t = result[k];
result[k] = [].concat(t,v);
}else{
result[k] = v;
}
});
if(sKey === void 0){
return result;
}else{
return result[sKey] || '';
}
}
思路其实都差不多:
- 匹配出key=value中的key和value;
- 需要返回对象,则匹配结果用对象存储起来,result[k] = v;
- 需要处理多个同名参数情况,利用concat拼接(concat返回的是数组副本)
- 需要考虑,输入了参数可是参数没对应,与没传入sKey 的情况
其实就是根据题目要求做出对应的返回,以及考虑问题要全面点(函数健壮性)。
可能有问题的地方
function(a,k,v),各输入参数是什么意思?
第一个参数a是整个匹配的字符串(例如上题,第一次会等于?key=1,第二次会等于key=2&,第三次会等于key=3&),接下来依次是正则里面的分组(小括号括起来为一组,),详情请查看正则表达式的replace方法。
为啥[].concat(t,v)不能写成t.concat(v)?
如果用t.concat(v),如果t不是数组,会变成字符串拼接。我们要用的concat方法是数组里那个。而第一个出现的t是字符串。
void 0 是啥?void有如下作用:
- 通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式。
- 填充
<a>
的href确保点击时不会产生页面跳转;
填充<image>
的src,确保不会向服务器发出垃圾请求。