题目描述
获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
示例1
输入
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key
输出
[1, 2, 3]
代码
下面的答案并非我自己写的,是参考牛客网上的大神的,看懂下面的代码还需要一下知识:
正则表达式
代码中的【/\??(\w+)=(\w+)&?/g】匹配信息如下:
replace()方法
ECMAScript v3 规定:
replace() 方法的参数 replacement 可以是函数而不是字符串。
在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。
最后一个参数是 stringObject 本身。
例子:
在本例中,我们将把字符串中所有单词的首字母都转换为大写:
name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
在本题目中,结合上面的正则表达式:a,模式的匹配项;k,第一个捕获组的匹配项;v,第二个捕获组的匹配项。
void 0取undefined
通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式
concat() 方法
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
例子 1
在本例中,我们将把 concat() 中的参数连接到数组 a 中:
<script type="text/javascript"> var a = [1,2,3]; document.write(
a.concat(4,5)
); </script>
输出:
1,2,3,4,5
例子 3
在本例中,我们创建了三个数组,然后使用 concat() 把它们连接起来:
<script type="text/javascript"> var arr = new Array(3) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" var arr2 = new Array(3) arr2[0] = "James" arr2[1] = "Adrew" arr2[2] = "Martin" var arr3 = new Array(2) arr3[0] = "William" arr3[1] = "Franklin" document.write(
arr.concat(arr2,arr3)
) </script>
输出:
George,John,Thomas,James,Adrew,Martin,William,Franklin
答案:
具体实现过程可以打断点看看!
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] || '';
}
运行环境:JavaScript (V8 6.0.0)
运行时间:1322ms
占用内存:77832KB