JavaScript 中URL 查询字符串(query string)的序列与反序列化
方法一:
在 JavaScript 中,可以使用 URLSearchParams 对象来处理 URL 中的查询字符串。
序列化(将 JavaScript 对象转换为查询字符串)可以使用 URLSearchParams 对象的 append() 方法,如下所示:
let params = new URLSearchParams();
params.append('name', 'John');
params.append('age', '30');
let queryString = params.toString();
console.log(queryString);
反序列化(将查询字符串转换为 JavaScript 对象)可以使用 URLSearchParams 的构造函数,如下所示:
let queryString = "name=John&age=30";
let params = new URLSearchParams(queryString);
console.log(params.get('name')); // "John"
console.log(params.get('age')); // "30"
对于反序列化的操作可以使用URL的search属性,来解析query string
let url = new URL('https://example.com?name=John&age=30');
let params = new URLSearchParams(url.search);
console.log(params.get('name')); // "John"
console.log(params.get('age')); // "30"
需要注意的是,URLSearchParams 对象只能用于处理查询字符串,而不能用于创建或解析整个 URL。
如果需要更高级的处理方式,可以使用其它库或第三方函数库,比如 qs, querystring 等库来处理。
对于反序列化的操作中的URLSearchParams的使用还有一些方法,比如:
has(name): 返回一个 Boolean 值,表示是否存在名称为 name 的查询参数。get(name): 返回名称为 name 的查询参数的值,如果不存在,则返回 null。getAll(name): 返回所有名称为 name 的查询参数的值组成的数组,如果不存在,则返回空数组。set(name, value): 设置名称为 name 的查询参数的值为 value。如果已经存在同名参数,将会覆盖原来的值。append(name, value): 添加名称为 name 的查询参数,并设置其值为 value。如果已经存在同名参数,会添加一个新的参数。delete(name): 删除名称为 name 的查询参数。entries(): 返回一个迭代器,遍历所有查询参数的键值对。keys(): 返回一个迭代器,遍历所有查询参数的名称。values(): 返回一个迭代器,遍历所有查询参数的值。
这些方法都能给出更灵活的操作,请根据具体需求来选择使用
方法二:
当然,如果需要手动处理查询字符串,也可以使用 JavaScript 的标准字符串处理函数来实现。
序列化,可以使用下面的代码把一个对象转换为查询字符串:
function objectToQueryString(obj) {
return Object.entries(obj).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&');
}
console.log(objectToQueryString({name: 'John', age: '30'}))
反序列化,可以使用下面的代码把查询字符串转换为一个对象:
function queryStringToObject(queryString) {
let obj = {};
let arr = queryString.split("&");
for(let i = 0; i < arr.length; i++){
let temp = arr[i].split("=");
obj[temp[0]] = temp[1];
}
return obj;
}
console.log(queryStringToObject('name=John&age=30'))
需要注意的是,上述代码使用了 encodeURIComponent 和 decodeURIComponent 来编码和解码查询字符串中的字符,以防止出现无效或不安全的字符。
这些方法都能达到相同的目的,你可以根据项目中使用的JavaScript环境和需要的复杂度来进行选择
JavaScript 中URL 查询字符串(query string)的序列与反序列化的更多相关文章
- 【本周面试题】第1周 - 获取URL中的查询字符串参数、get和post的区别
[此系列优先解决自己经历的面试题] 2018.11.16 面试题一:你如何获取浏览器URL中查询字符串中的参数? 题目代码: 测试地址为 https://www.sogou.com/tx?query= ...
- C# 获取url中的查询字符串参数
/// <summary> /// 获取url中的查询字符串参数 /// </summary> public static NameValueCollection Extrac ...
- 【Win 10 应用开发】分析 URI 中的查询字符串
分析URI中的字符有K种方法(K >= 2),如果查询字符串中的参数比较简单,可以通过子字符串查找的方式来处理:如果查询字符串相对复杂,你可以使用正则表达式来匹配 key1=value1 , ...
- querystring 解析url 查询字符串
对前端同学来说,经常要碰到一种比较麻烦的情况,那就是url查询字符串的解析问题.说起来也不难,就是比较麻烦. 具体来处理这种情况的时候,相信有一部分同学就是针对具体项目中的需要的字符去正则匹配一下,业 ...
- JavaScript中常见的字符串操作函数及用法
JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...
- JS如何获取url查询字符串的键和值?
/** * 根据url查询字符串里的键名获取其值 */function getSearchString(key, search) { // 获取URL中?之后的字符 var str = search; ...
- php的URL查询字符串解析函数
URL查询字符串格式:Data[650][BLN]=40002307312&Data[650][Status]=電聯無人接聽. 解析这种数据使用函数:parse_str(). parse_st ...
- JavaScript中,提取子字符串方法:Slice、Substring、Substr的比较。
在JavaScript中,提取子字符串主要是通过 Slice.Substring.Substr 三个方法之一. // slice // 语法: string.slice(beginSlice [, e ...
- Java与JavaScript中判断两字符串是否相等的区别
JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...
- 黑马旅游网 解析url查询字符串
function getUrlParam(name) { let reg = new RegExp("(^|&)" + name + "=([^&]*)( ...
随机推荐
- day01-3-界面显示&用户登录&餐桌状态显示
满汉楼01-3 4.功能实现02 4.2菜单界面显示 4.2.1功能说明 显示主菜单.二级菜单和退出系统功能 4.2.2代码实现 先搭建界面显示的大体框架,具体的功能后面再实现 创建MHLView类: ...
- 驱动开发:内核枚举LoadImage映像回调
在笔者之前的文章<驱动开发:内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个 ...
- C语言------数据类型与输入输出
仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4 .小结 1 .实训名称 实训2: ...
- 一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 21.对线程安全的理解 22.Thread和Runnable的区别 23.说说你对守护线程的理解 24.ThreadLoc ...
- LcdTools如何添加图片画面到PX01显示
LcdTools打开点屏工程,切到"画面设置"栏,在"画面资源"栏选择"Picture"画面,先设置图片ID编号(此编号用于PG对图片编号, ...
- 10.APIView视图
from rest_framework import status from rest_framework.response import Response from snippets.models ...
- FastAPI + tortoise-orm基础使用
更改sqlite为mysql from tortoise import Tortoise import asyncio async def init(): user = 'root' password ...
- 使用GitHub Actions实现自动化部署
前言 大家在工作中想必都是通过自动化部署来进行前端项目的部署的,也就是我们在开发完某个需求时,我们只需要将代码推送到某个分支,然后就能自动完成部署,我们一般不用关心项目是如何build以及如何depl ...
- 聊聊mysql的事务
今天来聊聊事务的四大特性以及其实现原理,需结合之前写的mysql是如何实现mvcc的来理解,因为大多数的实现都是基于mvcc的,理论介绍完后会通过实例来演示mvcc又是如何实现这些隔离级别的 事务的四 ...
- Linux网络通信(线程池和线程池版本的服务器代码)
线程池 介绍 线程池: 一种线程使用模式.线程过多会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务.这避免了在处理短时间任务时创建与销毁线程的 ...