JavaScript 获取 URL 参数的三种实现方案对比

作者:木棉时间:2026-10-23 11:38:22浏览:94

本文介绍了 JavaScript 中获取 URL 参数的三种常见实现方式。第一种为传统循环遍历法,逻辑简单但存在变量作用域隐患;第二种基于《JavaScript权威指南》的优化循环法,通过一次遍历返回参数对象,提高复用性;第三种利用正则表达式与 replace 函数结合 eval 的方法,虽代码复杂但展示了字符串替换的高级技巧。文章对比了各方案的优缺点及适用场景。

传统循环遍历法

以下是本站长期使用的几种获取 URL 参数的方法。

代码实现如下:

 
<script language="javascript" type="text/javascript">
function request(paras){
var url = location.href;
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&");
var paraObj = {}
for (i=0; j=paraString[i]; i++){
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length);
} 
var returnValue = paraObj[paras.toLowerCase()];
if(typeof(returnValue)=="undefined"){
return "";
}else{
return returnValue;
} 
} 
//下面是应用代码
var theurl
theurl=request("url");
if (theurl!=''){
location=theurl
} 
</script>

基于权威指南的优化循环法

接下来介绍基于正则表达式的函数实现。


利用 Javascript 正则表达式实现 URL 链接的解析类。


https://www.jb51.net/article/15000.htm



下面的代码结构略显复杂。


《JavaScript权威指南》中介绍了一种更简洁的获取 URL 参数的方法,无需使用正则表达式,仅需一次循环。该方法的优势在于一次性返回包含所有参数和值对的对象,只需调用一次函数,后续获取其他参数值时直接访问对象属性即可。


代码示例如下:

 
* 用法说明:
* var args = getArgs( ); // 从 URL 解析出参数
* var q = args.q || ""; // 如果定义了某参数,则使用其值,否则给它一个默认值
* var n = args.n ? parseInt(args.n) : 10;
*/ 
var getArgs = function ()
{ 
var args = new Object( ); //声明一个空对象
var query = window.location.search.substring(1); // 取查询字符串,例如从 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
var pairs = query.split("&"); // 以 & 符分开成数组
for(var i = 0; i < pairs.length; i++) {
var pos = pairs[i].indexOf('='); // 查找 "name=value" 对
if (pos == -1) continue; // 若不成对,则跳出循环继续下一对
var argname = pairs[i].substring(0,pos); // 取参数名
var value = pairs[i].substring(pos+1); // 取参数值
value = decodeURIComponent(value); // 若需要,则解码
args[argname] = value; // 存成对象的一个属性
} 
return args; // 返回此对象
} 

其突出优点是程序只需执行一次提取操作,后续重复获取参数值时无需再次调用函数,直接读取对象属性即可。这种方式获取 URL 参数既简便易行又易于理解。



正则表达式与 eval 组合方案

以下是我此前发表的“不用循环”但“代码较为复杂”的版本:


代码实现如下:

 
//不用循环纯用正则实现从 URL 中取参数的值。取代循环的核心技术是字符串的 replace() 方法可以用函数作第二参数,按用户定义的方式去替换。
//若有此参数名但无值,则返回空字符串;若无此参数名,返回 undefined。
var getArg = function(argname)
{ 
var str = location.href;
var submatch;
//先从 URL 中取出问号和井号之间的查询字符串,例如从 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
//问号是模式的特殊字符,所以要写成 \?;井号可有可无,所以模式结尾是 #?
if (submatch = str.match(/\?([^#]*)#?/))
{ 
//取到捕捉的子匹配形如 a1=v1&a2=&a3=v3,在前面加个 & 做成规则的 &a1=v1&a2=&a3=v3 便于下一步替换
var argstr = '&'+submatch[1];
//做个替换用的函数,把找到的每组形如 &a1=v1 替换成 a1:"v1", 这样的对象定义用的属性声明
var returnPattern = function(str)
{ 
//$1 和 $2 代表捕捉到的第1个和第2个子匹配,必须用在字符串里
return str.replace(/&([^=]+)=([^&]*)/, '$1:"$2",');
} 
//执行一个全局的正则替换,第二参数就是刚才定义的替换函数,把 a1=v1&a2=&a3=v3 替换成 a1:"v1",a2:"",a3:"v3",
argstr = argstr.replace(/&([^=]+)=([^&]*)/g, returnPattern);
//最后再执行一个对象的声明,需要形如 var retvalue = {a1:"v1",a2:"",a3:"v3"}; 的对象声明,而刚才替换完的字符串结尾还有个逗号,把结尾的逗号用 substr 截掉即可
eval('var retvalue = {'+argstr.substr(0, argstr.length-1)+'};');
//现在就得到了一个对象,URL 中每个参数名是其属性名,参数值是对应的属性值
return retvalue[argname];
} 
} 
//测试
document.write('a1='+getArg('a1')+', a2='+getArg('a2')+', a3='+getArg('a3'));
作者最新文章