前端项目,总免不了写一些操作 URL 中 query string 的 API 代码,比如读取当前 URL 中的 query 数据,或是根据一个 Object 对象拼接出一个 query string,等等。
其实,现代浏览器中已经提供了 URLSearchParams
类,可以大大简化这部分的操作,也无需再自己维护一个 qs
或是类似的包了。
以下介绍如何通过 URLSearchParams
实现 qs.stringify
和 qs.parse
API 的方法:
qs.parse
的方法比较简单,只需要将字符串传递给 URLSearchParams
并创建实例就可以了,实例本身自带了 iterator,也提供 get
,keys
等 API 能很方便的获取需要的数据。
const searchParams = new URLSearchParams(location.search);
for (const param of searchParams) {
const [key, value] = param;
console.log(key, value)
}
需要注意的一点是,不论参数传入的字符串是否以 ?
字符开头,URLSearchParams
都默认可以正确处理,不需要像 qs
包一样显示的指明给定的字符串是否有 ?
开头(ignoreQueryPrefix
)。
要实现 qs.stringify
的功能也不难,URLSearchParams
的构造器支持传入一个数组或一个对象,也提供了 append
API 可以将 key value 一组一组的加入到对象中,最后只要使用 toString
拼接出一个完整的字符串就可以了:
// result in: `a=b`
(new URLSearchParams({ a: 'b' })).toString();
// result in: `c=d&e=f`
(new URLSearchParams([ ['c', 'd'], ['e', 'f'] ])).toString();
注意,toString
方法得到的字符串,最开头并没有带上 ?
字符,如果有需要的话,可以自行加上。
综上,下面的等式是成立的(假定 location.search
不是一个空字符串):
location.search === `?${(new URLSearchParams(location.search)).toString()}`
当然,URLSearchParams
在某些场景下还是不能替换 qs
之类的库,比如:
- 项目需要支持老浏览器,如 IE 时。
URLSearchParams
的浏览器支持情况见:CanIUse,总体来说,现代的浏览器都已经支持了,但是 IE 完全没有。 - 需要使用一些比较冷门的解析功能时,如
qs
提供了很多复杂的解析方案(详情见文档)
但总体来说,绝大部分的应用场景下,URLSearchParams
都可以轻松应对,不需要额外的库进行志愿了。
更多关于 URLSearchParams
的介绍,可以参考 MDN,Easy URL Manipulation with URLSearchParams 或 WHATWG Spec。