推荐使用 URLSearchParams 接口解析 URL 查询参数,它兼容主流浏览器、语法简洁且支持增删改查;旧版浏览器可手动解析 location.search 字符串;还可封装函数支持默认值与类型转换,或通过 URL 构造器解析任意 URL。

如果您在 HTML 页面中需要读取当前 URL 中的查询参数(即类似?name=John&age=25 形式的数据),则需借助 JavaScript 解析 location.search 字符串。以下是多种获取并处理 URL 参数的方法:
一、使用 URLSearchParams 接口(现代标准方法)
URLSearchParams 是 浏览器 原生提供的 API,用于解析和操作 URL 查询字符串,兼容性良好(Chrome 49+、Firefox 44+、Edge 17+、Safari 10.1+),语法简洁且支持迭代与增删改查。
1、获取当前 URL 的查询部分:const searchParams = new URLSearchParams(window.location.search);
2、检查某参数是否存在:const hasName = searchParams.has(‘name’);
立即学习 “ 前端免费学习笔记(深入)”;
3、获取单个参数值(返回第一个匹配值):const name = searchParams.get(‘name’);
4、获取所有同名参数值(返回字符串数组):const values = searchParams.getAll(‘tag’);
5、遍历所有 键值对:for (const [key, value] of searchParams) {console.log(key + ‘: ‘ + value); }
二、手动解析 location.search 字符串(兼容旧版浏览器)
该方法不依赖新 API,适用于 IE9 及更早版本,通过截取 location.search 子串后按 & 和 = 分割,再逐项解码还原原始字符(如 %20→空格)。
1、提取问号后的查询字符串:const queryString = window.location.search.substring(1);
2、判断是否为空:if (!queryString) return {};
3、按 & 分割为参数对数组:const pairs = queryString.split(‘&’);
4、初始化空对象存储参数:const params = {};
5、对每对键值执行解码与赋值:pairs.forEach(pair => {const [key, value] = pair.split(‘=’); params[decodeURIComponent(key)] = decodeURIComponent(value || ”); });
三、封装为可复用函数(支持默认值与类型转换)
将解析逻辑封装成函数,可增强健壮性,例如自动处理 undefined 值、提供默认返回、尝试数字 / 布尔类型转换等,避免重复编写解析代码。
1、定义函数接收可选默认值对象:function getQueryParams(defaults = {}) {…}
2、内部调用 URLSearchParams 或回退到手动解析逻辑;
3、对每个参数值尝试类型推断:if (value === ‘true’) return true; else if (value === ‘false’) return false; else if (/^-?d+$/.test(value)) return parseInt(value, 10);
4、合并 defaults 与实际参数,缺失项以 defaults 中值填充;
5、返回最终参数对象:return Object.assign({}, defaults, params);
四、从指定 URL 字符串中提取参数(非当前页面)
当需要解析任意 URL(如 后端 返回的跳转链接、日志中的 URL 记录)而非仅当前页面时,不能直接使用 window.location,而应构造 URL 实例后再访问其 search 属性。
1、创建 URL 对象:const url = new URL(‘https://example.com/path?user=id123&mode=edit’);
2、获取其搜索参数:const searchParams = url.searchParams;
3、读取特定参数:const userId = searchParams.get(‘user’); // ‘id123’
4、注意:URL 构造函数在 IE 中不支持,需配合 polyfill 或改用正则解析;
5、若需兼容 IE,可用正则提取查询部分:const match = urlStr.match(/[?&]([^&=]+)=([^&]*)/g);
五、使用 正则表达式 精确匹配单个参数值
在仅需快速获取某个固定参数且环境受限(如无法使用 URLSearchParams、无权修改全局脚本)时,正则提供轻量级单点提取能力,但需注意特殊字符转义与 编码 问题。
1、构建带捕获组的正则:const regex = new RegExp(‘[?&]’ + encodeURIComponent(‘token’) + ‘=([^&]*)’);
2、执行匹配:const result = regex.exec(window.location.href);
3、提取解码后的值:const token = result ? decodeURIComponent(result[1]) : null;
4、为防止参数名前缀误匹配(如 match 匹配到 match_id),应在正则中加入边界控制:/(?