应使用 URL 构造函数 + URLSearchParams 安全操作 URL 参数,避免直接赋值 window.location.href 导致意外跳转;需更新地址栏而不刷新时,用 history.pushState() 或 replaceState() 配合 new URL()。
熟悉。但要注意:window.location 是只读对象(大部分属性),直接赋值会触发页面跳转,不是“操作”而是“导航”。真正安全可控的 URL 处理,应该用 URL 构造函数 + URLSearchParams。
window.location.href 来“修改参数”?因为写入 window.location.href = '...' 会立即刷新页面——这不是编辑,是重定向。常见误操作:想加一个 query 参数却导致白屏或无限重定向。
href
history.pushState() 或 history.replaceState()
location,用 new URL()
new URL() 怎么安全地增删查改 query 参数?它返回可变的 URL 实例,searchParams 属性支持标准的增删改查,不触发跳转。
const url = new URL('https://example.com/path?x=1&y=2');
url.searchParams.set('y', '3'); // 修改 y=3
url.searchParams.append('z', '4'); // 追加 z=4
url.searchParams.delete('x'); // 删除 x
console.log(url.href); // https://example.com/path?y=3&z=4
set(key, value):覆盖同名参数(只留一个)
append(key, value):允许重复 key(如 ?tag=a&tag=b)url.href 或 url.toString() 获取完整字符串searchParams 只管 ? 后面用 history.replaceState()(替换当前历史项)或 history.pushState()(新增历史项),再配合 new URL() 构造目标 URL。
立即学习“Java免费学习笔记(深入)”;
const url = new URL(window.location);
url.searchParams.set('page', '2');
history.replaceState(null, '', url); // 地址栏变,不刷新,不新增历史
URL 对象(现代浏览器支持)replaceState 不会触发 popstate,pushState 会(当用户点后退时)真正麻烦的从来不是“怎么改 URL 字符串”,而是改完之后要不要影响历史栈、要不要响应后退、服务端能否兜底。这些决策比调用哪个 API 更关键。