获取url参数的精简代码

题目描述

获取 url 中的参数

  1. 指定参数名称,返回该参数的值 或者 空字符串
  2. 不指定参数名称,返回全部的参数对象 或者 {}
  3. 如果存在多个同名参数,则返回数组

输入例子:

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] || '';
    }
}

思路其实都差不多:

  1. 匹配出key=value中的key和value;
  2. 需要返回对象,则匹配结果用对象存储起来,result[k] = v;
  3. 需要处理多个同名参数情况,利用concat拼接(concat返回的是数组副本)
  4. 需要考虑,输入了参数可是参数没对应,与没传入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有如下作用:

  1. 通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式。
  2. 填充<a>的href确保点击时不会产生页面跳转;
    填充<image>的src,确保不会向服务器发出垃圾请求。
原文地址:https://www.cnblogs.com/macq/p/6550885.html