JavaScript读取指定Cookie值的3种方法详解
你是不是经常遇到这种情况?明明用document.cookie拿到了数据,却死活取不到想要的那个值。或者代码在电脑上运行得好好的,一到手机就报错——就像新手如何快速涨粉需要技巧,搞懂Cookie的读取方法也得掌握正确姿势。今天咱们掰开揉碎了说,手把手教你三种实用方法。
先来唠唠最基础的操作。很多人卡在第一步:怎么从那一长串Cookie字符串里精准捞出想要的值?我见过有新手用substring硬截取,结果遇到特殊符号直接翻车。其实根本不用这么麻烦,咱们先看这个经典写法:
javascript复制function getCookie(name) { let cookies = document.cookie.split('; ') for(let item of cookies){ let [key,value] = item.split('=') if(key === name) return decodeURIComponent(value) } return null }
这里边藏着三个坑:第一,分割字符串必须用'; '(注意分号后面有空格);第二,记得处理URL编码;第三,循环里要用严格等于。特别是移动端,有些浏览器会自动加空格,不处理就会拿到undefined。
要是你觉得原生写法太麻烦,试试这个正则表达式方案:
javascript复制function getCookie(name) { let regex = new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`) return decodeURIComponent(document.cookie.replace(regex, "$1")) || null }
这个正则看着吓人,其实拆开看就明白:它专门抓取指定name的Cookie值,还能处理各种边缘情况。不过注意啊,特殊字符得做好转义,不然分分钟给你报语法错误。
第三种方法可能很多人没见过——用Web API新特性:
javascript复制const cookieList = document.cookie.split('; ').reduce((acc, cur) => { const [key, val] = cur.split('=') acc[key] = decodeURIComponent(val) return acc }, {})
这招直接把Cookie转成对象,想取哪个值直接点属性就行。不过要注意,这个方法在低版本IE上肯定歇菜,但现在都2024年了,谁还用IE啊是不是?
有人可能要问:为什么我照着写了还是拿不到值?八成是栽在这几个地方:
- Cookie设置了HttpOnly属性(这个真没法用JS读取)
- 路径或域名不匹配(比如在/test路径设置的Cookie,在根路径就拿不到)
- 用了第三方库覆盖了document.cookie(比如某些SSR框架)
说到移动端兼容,这里有个血泪教训:微信浏览器里获取Cookie,必须确保服务端设置了SameSite=None和Secure。上次我调试这个搞了整宿,最后发现是iOS的安全策略把Cookie拦截了。
现在来对比下三种方法的优缺点:
方法一:兼容性好,但处理复杂情况要自己加判断
方法二:代码简洁,但正则表达式对新手不友好
方法三:现代写法,但低版本浏览器不支持
最后说点实在的,刚开始学的时候别想着一步到位。先用第一种方法练手,等玩熟了再尝试高级写法。记住啊,代码不是越炫技越好,关键是稳定可靠。下次遇到Cookie问题,先把document.cookie打印出来看看,说不定问题就出在哪个不起眼的分号上呢。