如何操作URL_JavaScript中URL对象如何解析和构建

发布时间 - 2026-01-04 00:00:00    点击率:
URL构造函数可解析protocol、hostname、pathname、search、hash等只读属性,要求输入为完整合法URL(含协议和主机),否则报错;相对路径需提供base URL;修改查询参数须用URLSearchParams。

URL 构造函数能解析哪些部分

JavaScript 的 URL 构造函数会把传入的字符串按标准 URL 格式拆解成多个只读属性,比如 protocolhostnamepathnamesearchhash 等。它要求输入必须是**完整且语法合法的 URL**(即至少含协议和主机名),否则抛出 TypeError: Invalid URL

  • new URL("https://example.com/path?k=v#section") ✅ 成功
  • new URL("/path?k=v") ❌ 报错:缺少协议和主机
  • new URL("example.com/path") ❌ 报错:不是有效 URL(没协议)

如果只有相对路径,得手动补上基础 URL 才能解析:new URL("/path?k=v", "https://a.b") → 主机变为 a.b,路径为 /path

修改 search 参数要用 URLSearchParams

URL 对象的 search 属性是只读字符串(如 "?a=1&b=2"),不能直接拼接或正则替换。真正安全、可维护的做法是用 URLSearchParams 实例操作参数:

const url = new URL("https://api.example.com/data?limit=10");
url.searchParams.set("offset", "20");
url.searchParams.append("sort", "desc");
console.log(url.href); // https://api.example.com/data?limit=10&offset=20&sort=desc
  • set(key, value) 覆盖已有键(只保留一个)
  • append(key, value) 总是新增,支持重复键(如 ?tag=a&tag=b
  • delete(key) 移除所有匹配键值对
  • 直接赋值 url.search = "?x=1" 会重置整个查询串,但丢失原有参数结构逻辑

构建 URL 时 protocol 和 hostname 不能省略

即使目标是同源请求,也不能靠省略协议或主机来“简化”构造。下面这些写法都无效:

立即学习“Java免费学习笔记(深入)”;

  • new URL("//api.example.com/v1", location) → 协议未继承,报错
  • new URL("/v1?x=1", "example.com") → 主机字符串缺协议,报错
  • new URL("/v1", location.origin) ✅ 正确:以当前页面 origin 为 base

常见安全做法是显式使用 location.origin 或已知可信的 https://... 字符串作 base,避免因 base 不合法导致整个 URL 构造失败。

注意 pathname 的开头斜杠和编码行为

URL.pathname 始终以 / 开头(即使是根路径 /),且自动对路径中非 ASCII 字符或特殊符号做百分号编码:

const u = new URL("https://x.y/z 三/α?k=1");
console.log(u.pathname); // "/z%20%E4%B8%89/%CE%B1"
console.log(u.search);  // "?k=1"
  • 手动设置 url.pathname = "/user/张" 会被自动编码为 /user/%E5%BC%A0
  • 若需保持原始字符串不做编码,只能拼接在 href 上(但失去结构化优势)
  • 路径末尾多斜杠(如 //api//v1/)会被规范为单斜杠(/api/v1/

路径解析依赖浏览器的 URL 标准实现,不同环境(如某些 Node.js 版本)对边缘 case 处理略有差异,生产中建议始终用 URL + URLSearchParams 组合,别手写字符串拼接。


# javascript  # java  # js  # node.js  # node  # 编码  # 浏览器  # app  # 键值对 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Bootstrap整体框架之JavaScript插件架构  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  微信小程序 require机制详解及实例代码  如何选择PHP开源工具快速搭建网站?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何快速生成高效建站系统源代码?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  JavaScript Ajax实现异步通信  如何在万网开始建站?分步指南解析  如何用狗爹虚拟主机快速搭建网站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  iOS UIView常见属性方法小结  香港服务器租用每月最低只需15元?  如何实现javascript表单验证_正则表达式有哪些实用技巧  详解CentOS6.5 安装 MySQL5.1.71的方法  如何用VPS主机快速搭建个人网站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  微信小程序 五星评分(包括半颗星评分)实例代码  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何快速查询网址的建站时间与历史轨迹?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何自定义建站之星模板颜色并下载新样式?  Android okhttputils现在进度显示实例代码  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Java垃圾回收器的方法和原理总结  高防服务器租用首荐平台,企业级优惠套餐快速部署  微信小程序 wx.uploadFile无法上传解决办法  如何在Windows 2008云服务器安全搭建网站?  Laravel怎么实现验证码(Captcha)功能  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何配置Horizon来管理队列?(安装和使用)  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在IIS中新建站点并配置端口与IP地址?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel中的withCount方法怎么高效统计关联模型数量