document.cookie读取仅返回分号分隔的字符串,无原生解析能力,需手动拆分、匹配键名并decodeuricomponent解码值,且同名cookie按作用域隔离。

document.cookie 读取时只能拿到整个字符串,没法直接解析
浏览器的 document.cookie 是一个特殊属性:读取它返回的是一个以分号加空格(; )分隔的原始字符串,比如 "theme=dark; expires=Wed, 01 Jan 2025 00:00:00 GMT; path=/; secure"。它不提供原生的键值对解析方法,也不能用 JSON.parse 或 URLSearchParams 直接处理——因为每个 cookie 条目可能附带 expires、path、domain、secure 等元信息,而这些和键值本身混在同一段里。
所以你不能写 document.cookie.theme,也不能直接 document.cookie.split(';') 就完事——得手动按 = 拆,还得考虑值里可能含等号(虽然少见)、空格、URL 编码等问题。
- 最安全的读取方式是写一个辅助函数,用正则匹配
^key=([^;]*),并decodeURIComponent解码值 - 注意:多个同名 cookie(如不同
path或domain)可能共存,但document.cookie读取时只返回当前上下文可见的那个 - 如果值里有分号或逗号,浏览器会自动 URL 编码,所以解码不可跳过
设置 cookie 必须拼成 key=value 形式,且元参数要写全
给 document.cookie 赋值不是覆盖,而是「添加或更新」——每次赋值都是一条新语句,格式必须是 key=value 开头,后面可跟分号分隔的选项。比如:
document.cookie = "token=abc123; expires=Fri, 31 Jan 2025 12:00:00 GMT; path=/; secure; SameSite=Lax";
常见错误包括:
- 漏掉
=,比如document.cookie = "debug"→ 浏览器当作debug=(空值)处理 - 忘记
expires或max-age→ cookie 变成会话级(关闭标签页即失效) -
secure选项在非 HTTPS 页面设置会被忽略,但不会报错,容易误以为设成功了 -
SameSite值必须大写首字母(Lax/Strict/None),小写无效
删除 cookie 实际上是“过期它”,且 path/domain 必须严格匹配
没有 document.cookie.delete() 这种方法。要删 cookie,得用相同的 key + 已过期的 expires,再确保 path 和 domain 与当初设置时完全一致,否则旧 cookie 依然存在。
- 最简安全删除写法:
document.cookie = "mykey=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;" - 如果原 cookie 设了
path=/admin,删除时也得写path=/admin,写成path=/删不掉 - 若原 cookie 设了
domain=.example.com,删除时domain参数不能省略,否则匹配失败 - 注意:某些浏览器对
expires时间精度敏感,用Date.now() - 1可能因毫秒差异失效,稳妥起见用固定过去时间
第三方上下文或 iframe 中 document.cookie 可能被限制
现代浏览器默认对跨域 iframe 或第三方 cookie 施加严格限制。即使页面同源,只要在嵌套的 <iframe src="https://other.com"></iframe> 里执行 document.cookie,也可能返回空字符串或抛出异常——这不是代码写错了,而是 SameSite 和 Secure 策略生效了。
- 检查是否在 iframe 里运行:用
window.self === window.top判断 - 若需跨域共享 cookie,服务端必须明确设置
Set-Cookie头含SameSite=None; Secure,且页面协议必须是 HTTPS - Chrome 80+ 默认把不带
SameSite的 cookie 当作SameSite=Lax,这意味着重定向或表单 POST 进来的请求不会带上它
真正麻烦的从来不是语法,而是 cookie 的作用域规则和浏览器策略之间那几行容易被忽略的 path=、domain= 和 SameSite=。写错一个字符,就可能让 set 和 get 完全对不上号。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











