URLSearchParams

JavaScript

前端项目,总免不了写一些操作 URL 中 query string 的 API 代码,比如读取当前 URL 中的 query 数据,或是根据一个 Object 对象拼接出一个 query string,等等。

其实,现代浏览器中已经提供了 URLSearchParams 类,可以大大简化这部分的操作,也无需再自己维护一个 qs 或是类似的包了。

以下介绍如何通过 URLSearchParams 实现 qs.stringifyqs.parse API 的方法:

qs.parse 的方法比较简单,只需要将字符串传递给 URLSearchParams 并创建实例就可以了,实例本身自带了 iterator,也提供 getkeys 等 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 之类的库,比如:

  1. 项目需要支持老浏览器,如 IE 时。URLSearchParams 的浏览器支持情况见:CanIUse,总体来说,现代的浏览器都已经支持了,但是 IE 完全没有。
  2. 需要使用一些比较冷门的解析功能时,如 qs 提供了很多复杂的解析方案(详情见文档

但总体来说,绝大部分的应用场景下,URLSearchParams 都可以轻松应对,不需要额外的库进行志愿了。

更多关于 URLSearchParams 的介绍,可以参考 MDNEasy URL Manipulation with URLSearchParamsWHATWG Spec