推荐使用 JavaScript 的 URL 构造函数解析和操作 URL,因其自动处理编码、提供结构化属性访问、防止注入错误且兼容性良好。
直接用 JavaScript 的 URL 构造函数解析和操作 URL,比手动字符串拼接更安全、更可靠,因为它自动处理编码、边界情况和协议合规性。
URL 中的路径、查询参数等若含空格、中文、&、=、/ 等字符,手动拼接极易出错。字符串拼接不会自动编码,容易导致 URL 无效或语义错误。
例如:
❌ 错误拼接:"https://api.com/search?q=" + userInput(userInput = "hello world" → 变成 q=hello world,空格未编码,服务器可能收不到完整值)
✅ 正确做法:
new URL() 创建对象,再通过 .searchParams.set() 添加参数encodeURIComponent()
params.set("q", "hello world") → 实际生成 q=hello%20world
字符串是扁平文本,提取协议、主机、路径、参数需正则或 split(),脆弱且易漏边界(如带端口的 host、带锚点的 hash、带用户信息的 auth 部分)。
URL 对象把 URL 拆成标准属性:
url.protocol
→ "https:"
url.hostname → "example.com"
url.port → "3000"(如有)url.pathname → "/users"
url.searchParams.get("id") → 安全取参数值(自动解码)url.hash → "#section1"
修改某一部分不会影响其他部分,无需担心破坏原始结构。
手动拼接容易引入意外字符,造成路径穿越(如 ../)、协议混淆(如 javascript:)、或非法 query 格式(如多个 & 连续、缺失 =)。
URL 构造函数会在创建时校验基本格式;searchParams 接口只接受合法键值对,拒绝无效输入(如 null 或 undefined 键),并统一标准化输出。
例如:const u = new URL("https://a.com"); u.pathname = "../admin";
实际生效的是 /admin(浏览器自动规范化路径),不会产生危险的相对跳转。
URL 构造函数自 Chrome 35、Firefox 26、Safari 10.1、Edge 17 起已全面支持。Node.js 从 v10.0.0 开始内置。搭配 searchParams(IE 不支持,但可用 polyfill)即可覆盖绝大多数场景。
不复杂但容易忽略