Headers 与 Map 的差异
Headers 并不是处处都像 Map 那样通用。在初始化时,Headers 对象接受键值对形式的对象,而 Map 则不行。
let seed = { foo: 'bar' };
let h = new Headers(seed);
console.log(h.get('foo')); // bar
let m = new Map(seed);
// TypeError: object is not iterable
多值处理与 append
HTTP 头部字段允许存在多个值,Headers 通过 append() 支持这一特性。如果头部不存在,相当于调用 set();后续追加会以逗号为分隔符拼接。
let h = new Headers();
h.append('foo', 'bar');
console.log(h.get('foo')); // "bar"
h.append('foo', 'baz');
console.log(h.get('foo')); // "bar, baz"
头部护卫机制
并非所有 HTTP 头部都能被客户端随意修改,Headers 对象引入了护卫(Guard)机制来防止非法操作。违反限制会抛出 TypeError。不同来源的实例护卫设置不同。
| 护卫 | 适用情形 | 限制 |
|---|---|---|
| none | 构造函数创建 Headers 实例 | 无 |
| request | Request 初始化且 mode 非 no-cors | 不允许修改禁止修改的头部 |

