new urlsearchparams() 必须传入合法查询字符串(如location.search)、url对象的searchparams属性或键值对对象,直接调用会创建空实例;get()返回首个值,getall()返回全部同名参数数组。

new URLSearchParams() 传什么才有效
直接写 new URLSearchParams() 得到的是空实例,啥参数也没有。它不会自动读取当前地址栏,也不会识别完整 URL 字符串。
常见错误是传入带协议的字符串,比如 new URLSearchParams("https://a.com/?a=1")——这会把整个 https://a.com/?a=1 当作一个 key,值为空,解析完全失效。
- 要解析当前页参数:用
new URLSearchParams(location.search)(location.search自带?,URLSearchParams 能正确处理) - 要解析任意 URL 字符串:必须先用
new URL(urlStr)提取.searchParams,即new URL("https://a.com/?a=1").searchParams - 要从对象构建参数:直接
new URLSearchParams({a: "1", b: "2"}),注意值必须是字符串或可转字符串的类型,数字会被自动 toString()
get() 和 getAll() 到底该用哪个
这取决于后端怎么收、前端逻辑怎么设计。很多 bug 都出在默认用 get() 却没意识到参数可能重复。
比如复选框生成的 ?tag=js&tag=html&tag=css,用 params.get("tag") 永远只拿到 "js";而 params.getAll("tag") 返回 ["js", "html", "css"],这才是真实意图。
-
get("key"):适合单值场景(如id、page),返回第一个匹配值,无则返回null -
getAll("key"):适合多选、标签、过滤器等场景,返回数组,即使只有一个值也是["x"] - 别用
get("key") !== undefined判存在——空字符串""时get()返回"",但has("key")才真正反映键是否存在
set() 和 append() 的行为差在哪
关键区别就一条:是否允许同名参数共存。这个选择直接影响后端拿到的是单值还是多值。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
比如初始参数是 ?q=hello,执行 params.append("q", "world") 后变成 ?q=hello&q=world;而 params.set("q", "world") 会删掉旧的,只剩 ?q=world。
-
set("k", "v"):先删所有同名项,再写入一个 —— 保证唯一性,适合控制分页、排序、单选类参数 -
append("k", "v"):无条件追加 —— 保留多值语义,适合复选框、多标签筛选 - 想“删掉再新增多个”?用
delete("k")+ 多次append("k", val),别依赖set()实现批量
怎么安全同步到地址栏不刷新页面
千万别直接改 location.search 或赋值 location.href,那会触发跳转、丢失滚动位置、重载页面。
标准做法是用 history.replaceState() 替换当前 history 条目,它只改 URL 不触发 reload。
-
history.replaceState(null, "", `?${params.toString()}`)—— 注意第三个参数是完整路径,必须带? - 如果原 URL 有 hash(如
#section2),得手动拼回去:`?${params.toString()}#section2` -
params.toString()会自动编码,结果不含?,所以前面要补上 - 服务端渲染(SSR)或 Node.js 环境下,别用
location.search,改用new URL(req.url).searchParams
最常被忽略的是类型转换和编码边界:所有 get() 返回的都是字符串,"1" 不等于 1;手动拼接时漏 encodeURIComponent,遇到中文或 & 就崩;而 URLSearchParams 内部全包了,但 polyfill 很难 100% 对齐,尤其在 IE 中。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










