document.cookie无键值设置的特殊行为及相关技术问题咨询
该行为存在于Chrome和Firefox的最新版本中。
假设我们通过以下JavaScript代码设置常规Cookie:
document.cookie = "is_halloween=true"; document.cookie = "skeletons=spooky";
如果打破常规执行如下操作:
document.cookie = "BOO";
在控制台查看document.cookie的值,结果为:
is_halloween=true; skeletons=spooky; BOO
尝试用常规删除代码无法移除这个BOO:
document.cookie = "BOO=;expires=Thu, 01 Jan 1970 00:00:00 GMT;";
执行后document.cookie仍为is_halloween=true; skeletons=spooky; BOO。即使设置空字符串也无效:
document.cookie = "";
结果依然不变。
问题解答
1. 这种特殊行为是否是自定义Cookie语法的自由文本字段?是否有文档记录?
你设置的BOO是无值Cookie,这是符合HTTP Cookie规范的——Cookie允许仅存在名称、省略值的形式(即Name;格式,等号和值都可省略)。
这并非所谓的“自由文本字段”,而是浏览器对Cookie规范的标准实现:当执行document.cookie = "BOO"时,浏览器会将其解析为名称为BOO、值为空的Cookie,并添加到Cookie列表中。
这类行为在RFC 6265规范中有明确说明:Cookie语法支持name=value形式,其中value部分可以为空(此时等号也可省略),浏览器会正确识别并存储这类Cookie。
2. 如何删除BOO?
常规删除方法无效的原因是:你尝试匹配的是带等号的BOO=,但实际存储的是无值的BOO,Cookie名称的匹配规则会严格区分这种形式。
正确的删除方式是直接指定Cookie名称(不带等号)并设置过期时间:
document.cookie = "BOO;expires=Thu, 01 Jan 1970 00:00:00 GMT";
不需要写BOO=,直接用名称就能匹配到那个无值Cookie,执行后即可成功移除它。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

