assign在历史栈新增记录,支持返回;replace直接替换当前记录,无法返回原页。前者适用于常规导航,后者适用于登录成功等敏感操作后的跳转,需根据用户是否需要“回退权”选择。

用 window.location.assign() 和 window.location.replace() 跳转,核心区别就在浏览器历史栈里“留不留痕迹”——一个加新记录,一个直接覆盖。
assign:跳转后能点「返回」回到当前页
它把目标 URL 推入历史栈顶部,和用户手动点链接、输地址回车效果一致。刷新页面、后退、前进都正常工作。
- 适合常规导航,比如从首页点进详情页、菜单切换等
- 写法简洁:
window.location.assign('https://example.com') - 语义比直接赋值
href更明确,团队协作时可读性更好
replace:跳转后无法返回原页面
它用新页面完全替换当前历史记录项,原页面在历史栈中消失。用户点「返回」会跳到上上个页面,不是刚离开的那个。
- 适合敏感操作后的跳转,如登录成功、表单提交完成、支付回调
- 避免用户点返回重复提交或看到过期表单
- 写法:
window.location.replace('https://example.com')
实际选哪个?看用户是否需要「回退权」
如果跳转是流程终点(比如登录完进了后台),就用 replace;如果只是中间一站(比如文章列表→某篇文章),就用 assign 或 href。
- 不要在登录成功后用
assign,否则点返回又回到登录框,可能触发二次提交 - 也不要对普通链接用
replace,会破坏用户自然浏览习惯 - 两者都不影响参数传递,URL 中的查询参数(
?id=123)照常生效
小提醒:别混用,也别漏校验
跳转前建议简单判断 URL 是否合法,尤其当 URL 来自用户输入或接口返回时,防止 XSS 风险。
- 可用正则粗筛协议头:
url.startsWith('https://') || url.startsWith('http://') - 避免直接拼接不可信字符串到 location 操作中
- 多次触发跳转时加防抖,比如按钮连点,防止重复跳转报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











