headers.entries()、keys()、values()均返回不可重用的惰性迭代器,按插入顺序产出内容;entries()返回键值对,keys()仅返回小写头名,values()逐个返回各值,修改headers后需重新调用获取最新状态。

Headers.entries()、keys() 和 values() 都返回迭代器(Iterator),不是数组,不能直接用 map 或 length;它们按插入顺序产出内容,且**不可重用**——一旦遍历完,再次调用 next() 就始终返回 {done: true}。
entries():同时拿到键和值,适合结构化处理
Headers 的 entries() 返回键值对数组 [key, value] 的迭代器,每项 key 是小写的响应头名(如 "content-type"),value 是对应值(可能为字符串或字符串数组,取决于具体头字段)。
- 推荐用
for...of解构:for (const [header, value] of headers.entries()) { console.log(header, value); } - 转成数组便于后续操作:
Array.from(headers.entries())→ 得到[["content-type", "text/html"], ["cache-control", "no-cache"]] - 注意:
headers[Symbol.iterator] === headers.entries(),所以for (const pair of headers) {...}等价于用entries()
keys():只取头字段名,适合检查存在性或过滤
keys() 迭代器产出的是所有 header 名(全小写字符串),不带值。它比 has() 更适合批量判断或生成白名单。
- 快速列出所有头:
Array.from(headers.keys())→["content-type", "set-cookie", "x-powered-by"] - 配合
includes做条件判断:if (Array.from(headers.keys()).includes("authorization")) { ... } - 不能直接用
headers.keys().includes(...)—— 迭代器没有includes方法
values():专注提取头字段值,适合统一处理内容
values() 返回每个 header 对应的值,对多值头(如 Set-Cookie)会返回单个字符串(浏览器自动合并为逗号分隔?不,实际是每次只返回一个值;但注意:Headers 规范中同一名称可多次设置,values() 按插入顺序逐个产出每个值,不是合并后的字符串)。
- 获取全部值数组:
Array.from(headers.values())→["application/json", "max-age=3600", "Express"] - 与
keys()同步遍历时保持顺序一致:
两次调用keys()和values()独立,但各自内部顺序都严格匹配插入顺序 - 无法通过值反推键名 —— Headers 不提供反向查找接口
常见误区与避坑提醒
这三个方法返回的都是**惰性迭代器**,不是实时快照:创建后若 Headers 实例被修改(如后续调用 append() 或 set()),已创建的迭代器不会反映新增/变更项;它只遍历调用 keys() 等时已存在的条目。
- ❌ 错误写法:
const iter = headers.values(); headers.set("x-trace", "123"); for (const v of iter) {...} // 不包含新设的值 - ✅ 正确做法:需要最新状态,就重新调用
values()获取新迭代器 - ⚠️ 不要试图复用同一个迭代器多次:
const k = headers.keys(); [...k]; [...k]; // 第二次为空数组










