在阅读一段源码时,看到这么一段代码,可以获取到地址中所有的参数:
function getUrlVars(href) {
var vars = {};
var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {
vars[key] = value;
});
return vars;
}
这里重点要说的就是 replace 的第二个参数。我们一般用法是这样:
.replace("a", "b")
作用就是将 a 替换成 b。但是很少用到第二参为函数的情况,如开始的那段代码里,就使用了一个函数。要理解这个用法,我们需要掌握两个概念:
1. 正则表达式(很简单的用法,了解一下,别被吓跑)
1.1 分组
/[?&]+([^=&]+) =([^&]*) /gi
在这个正则中,有两组 ( ) 及中间的内容就是分组,我们可以将第一个 ([^=&]+) 也就是第一组匹配到的内容起个名字叫 key,第二组([^&]*) 匹配到的内容起个名字叫 value,这样我们就能得到地址中想要的参数名和参数值。
2. replace() 的第二参函数是有默认参数的
我们可以给个带参数的地址试着打印,看看默认参数里有些什么内容:
function getUrlVars(href) {
var vars = {};
var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function() {
console.log(arguments);
});
return vars;
}
let _params = getUrlVars("https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json");
console.log(_params);
输出的结果:
[Arguments] {
'0': '?q=js',
'1': 'q',
'2': 'js',
'3': 26,
'4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
'0': '&form=QBRE',
'1': 'form',
'2': 'QBRE',
'3': 31,
'4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
'0': '&sp=-1',
'1': 'sp',
'2': '-1',
'3': 41,
'4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
[Arguments] {
'0': '&pq=json',
'1': 'pq',
'2': 'json',
'3': 47,
'4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
看到运行结果就一目了然了:
href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function())
执行 replace 时,正则的匹配其实就是一个 match 的过程,每匹配到一个结果,就会执行一次 function() 。
所以,我们提供的地址中有4个参数,也就执行了4次 function() ,将每次 function() 的默认参数打印出来就得到了上边的结果。
默认参数:
第一个是匹配到的值,第二个是分组一得到的内容,第二个是分组二得到的内容,第三个是正则匹配的位置索引,第四个是原字符串。
这里我们就要抓住机会,为默认参数命名,拿刚才打印的第一条内容来讲:
[Arguments] {
'0': '?q=js',
'1': 'q',
'2': 'js',
'3': 26,
'4': 'https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json'
}
function (m, key, value)
第一个参数命名为 m:得到 ?q=js 这个结果我们没用,但是作为占位,就随便起个名字。 第二个参数命名为 key:q 也就是第一个分组的到的内容,也就是地址参数名。 第二个参数命名为 value:js 是第二个分组得到的内容,也就是参数值。 后边的参数,我们用不到,就不用管了,空着就行。
最后:来个完整的用法
function getUrlVars(href) {
var vars = {};
var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
vars[key] = value;
});
return vars;
}
let _params = getUrlVars("https://cn.bing.com/search?q=js&form=QBRE&sp=-1&pq=json");
console.log(_params);
|