当前位置:首页 > 技术 > 正文内容

深入解析 JavaScript FormData 对象

访客 技术 2026年9月27日 13

FormData 是浏览器内置的 API,用于构造一组键值对来表示表单字段。它最常见的应用场景是文件上传,配合 multipart/form-data 编码类型,可以实现与服务器端的流式数据传输。

构造函数接受两个可选参数:

  • form:HTML 表单元素
  • submitter:触发提交的按钮元素
const fd = new FormData();

核心方法详解

1. append 与 set

append(name, value) 用于添加数据,当同名键存在时不会覆盖,而是新增一条记录。这与普通对象的行为截然不同——FormData 允许一个键对应多个值。

const fd = new FormData();
fd.append('tag', 'javascript');
fd.append('tag', 'typescript');
fd.append('tag', 'node');

set(name, value) 同样用于添加数据,但如果键已存在,会移除该键的所有旧值后再写入新值。

const fd = new FormData();
fd.set('status', 'active');
fd.set('status', 'inactive'); // 最终仅剩 'inactive'

fd.append('count', '5');
fd.set('count', '10'); // 覆盖为单个值 '10'

2. 数据读取:get 与 getAll

const fd = new FormData();
fd.append('score', '85');
fd.append('score', '92');

console.log(fd.get('score'));      // "85"
console.log(fd.getAll('score'));   // ["85", "92"]

fd.set('score', '100');
console.log(fd.getAll('score'));   // ["100"]

3. 存在性检测:has

const fd = new FormData();
fd.append('id', '007');
console.log(fd.has('id'));       // true
console.log(fd.has('password')); // false

4. 删除数据:delete

该方法会彻底清除指定键的所有条目,无论该键存在多少条记录。

const fd = new FormData();
fd.append('temp', 'a');
fd.append('temp', 'b');
fd.delete('temp');
console.log(fd.getAll('temp'));  // []

5. 迭代器方法

FormData 实现了 Iterable 接口,提供了三种获取遍历器的方式:

const fd = new FormData();
fd.append('lang', 'rust');
fd.set('year', '2024');

// 获取所有键
const allKeys = [...fd.keys()];
console.log(allKeys);  // ["lang", "year"]

// 获取所有值
const allValues = [...fd.values()];
console.log(allValues);  // ["rust", "2024"]

// 获取键值对
const pairs = [...fd.entries()];
console.log(pairs);  // [["lang", "rust"], ["year", "2024"]]

进阶特性

原生遍历支持

由于实现了 Symbol.iterator,FormData 可直接用于 for...of 循环,也可用展开运算符处理。默认迭代行为与 entries() 一致。

const fd = new FormData();
fd.append('framework', 'react');
fd.append('framework', 'vue');

for (const entry of fd) {
  console.log(entry);
}
// 输出: ["framework", "react"]
//       ["framework", "vue"]

console.log([...fd]);  // 等价于 [...fd.entries()]

转换为普通对象

借助 Object.fromEntries 可实现转换,但需注意:对象键的唯一性会导致同键多值的情况丢失数据。

const fd = new FormData();
fd.append('category', 'frontend');
fd.append('category', 'backend');
fd.set('name', 'dashboard');

const plain = Object.fromEntries(fd);
console.log(plain);
// { category: "backend", name: "dashboard" }
// 注意: "frontend" 已丢失

生成 URL 查询字符串

FormData 可作为 URLSearchParams 的构造参数,快速生成编码后的查询字符串。此特性适用于需要兼容传统表单提交的场景。

const fd = new FormData();
fd.append('keyword', 'webassembly');
fd.append('page', '3');

const qs = new URLSearchParams(fd).toString();
console.log(qs);  // "keyword=webassembly&page=3"

需注意的是,当同一键存在多个值时,查询字符串会保留重复参数,服务端需按相应规则解析。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。