new url() 报错“invalid url”是因为输入字符串不符合url标准格式,如缺协议、含未编码空格或非法字符;相对路径必须配合法base参数,且中文等需预先编码。

new URL() 解析字符串时为什么报错 "Invalid URL"?
因为传入的字符串不符合 URL 基本格式,比如缺少协议、含非法字符、或路径以空格开头。浏览器不会自动补 http://,也不会帮你 trim 空格。
- 错误写法:
new URL("example.com/path")→ 缺少协议,直接抛错 - 正确写法:
new URL("https://example.com/path")或new URL("/path", "https://example.com") - 相对路径必须配合 base 参数使用,否则仍会报错
- 中文、空格、
#、?等需已编码;未编码的new URL("https://a.com/q?k=你好")会失败
用 URL.searchParams 处理查询参数比拼接字符串强在哪?
它自动处理编码/解码,避免手动调 encodeURIComponent() 漏掉某处,也防止重复添加同名参数时覆盖逻辑出错。
-
url.searchParams.set("q", "a&b")→ 自动转为q=a%26b,不用自己编码 -
url.searchParams.get("q")→ 返回解码后的"a&b",不是原始"a%26b" -
url.searchParams.append("tag", "前端")可追加同名参数,而set()是覆盖 - 多次调用
set()同一个 key,最终只保留最后一次值
构造带锚点和动态路径的 URL 时容易忽略什么?
pathname 和 hash 都要手动加斜杠或井号,它们不会自动补全;改完属性后必须读 href 才能拿到完整字符串,直接打印对象看不出变化。
-
url.pathname = "user/profile"→ 结果是.../user/profile,不是.../user/profile/(末尾不自动加斜杠) -
url.hash = "section-2"→ 得到#section-2,但写url.hash = "section-2"不等于url.hash = "#section-2"(后者会变成##section-2) - 修改属性后,
url对象本身不自动更新href字段;必须访问url.href才触发重新序列化 - 如果 base URL 带查询参数(如
https://a.com/?ref=1),用它构造相对路径时,新 URL 会继承这些参数 —— 这常被误认为“污染”
URL 构造在 SPA 路由或 API 请求中要注意兼容性
IE 完全不支持 URL 和 URLSearchParams,哪怕加了 polyfill,new URL(relative, base) 在 Safari 10.1 之前也不可用。
- 需要兼容旧浏览器时,别依赖
new URL("/api", window.location),改用window.location.origin + "/api"更稳妥 -
URLSearchParams的.entries()和.forEach()在部分安卓 WebView 中行为异常,优先用.get()/.getAll() -
URL实例不可 JSON.stringify(),序列化前得先取url.href - 服务端渲染(如 SSR)环境可能没有
window或URL全局对象,Node.js 10+ 才原生支持,低版本需require('url').URL
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











