头图

如何方便的获取 cookie 中的值?

我们知道,通过 document.cookie 可以获取到当前网站所有可用的 cookie

console.log(document.cookie);
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'
当然,细心的小伙伴肯定知道:如果在 Set-Cookie 时设置了 HttpOnly 属性,那么 document.cookie 是无法获取到这个 cookie 的。

好了,现在已经获取到了 cookie,但是他是一个字符串,那如何获取到对应 key 的值呢?

一般情况下,咱们肯定是在 npm 中找一个成熟的第三方库来实现此功能,比如:js-cookie

但是如果咱们只是想要某个 key 的值,并不需要添加或删除 cookie 呢?

在这种场景下,咱们就可以自己手动实现此功能,来减少第三方依赖和打包后的体积。

实现思路

字符串分割

按照 MDN 上面的定义,通过 document.cookie 获取到是通过 ; (分号和空格)连接的 key=value 字符串。

所以,咱们直接通过字符串的 split 方法分割 2 次,即可格式化好所有的 cookie

// console.log(document.cookie); 
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'

const cookieMap = new Map();

document.cookie.split("; ").forEach((cookie) => {
    const [key, value] = cookie.split("=");
    cookieMap.set(key, value);
})

console.log(cookieMap.size);
// 3

console.log(cookieMap.get("username"));
// FEHub

正则匹配

字符串的 match 方法可以传入一个正则表达式用来匹配内容。

如果我们要获取 username 的值,那么可以这样写:

// console.log(document.cookie); 
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'

// 匹配一个存在的值
const result = document.cookie.match(/username=(\w+)/);
//  ['username=FEHub', 'FEHub', index: 29, input: 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236', groups: undefined]

console.log(result[1]);
// FEHub

// 匹配一个不存在的值
const result2 = document.cookie.match(/xxx=(\w+)/);
//  null

针对上面的正则,做一个简单的解释:

  • \w:表示匹配字母、数字、下划线。
  • +:表示至少匹配一次前面的子表达式。
  • ():表示将匹配到的内容放入分组内。

如果匹配到内容,那么直接通过下标 1 即可获取对应的值。

如果获取不到内容, 那么返回值就是 null

然后咱们稍微封装一下,让他变得更通用一些:

const getCookie = (key) => {
  const { cookie } = document;
  return cookie.match(new RegExp(`${key}=(?<key>\\w+)`))?.groups?.key;
};


// console.log(document.cookie); 
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'

console.log(getCookie('username'));
// FEHub

这里再简单提一嘴:

  • 通过 new RegExp 动态生成正则,这样可以动态指定获取的 key
  • 由于生成正则时传入的是字符串表达式,所以需要将 \w 转义为 \\w
  • (?<Name>x) 是正则的具名捕获组语法,目的是为了可以更明确的取值。

关注我

好了,这就是今天分享的全部内容啦 ~

关注我,每天学一个有趣的小知识 😉

微信扫一扫,关注「FEHub」


FEHub
一起学前端 :)

念念不忘,必有回响。

117 声望
8 粉丝
0 条评论
推荐阅读
如何获取 <script> 标签上自定义参数的值?
前段时间开发了一个小插件,功能很简单,引入之后脚本会自动执行一些逻辑,所以在发布时将它打包成了 IIFE 模式的 js 包。在项目中接入时,直接通过 script 标签引入即可,就像这样: {代码...} 但是在插件的后续...

asong1阅读 1.1k

封面图
JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...

jenemy49阅读 7.3k评论 12

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs42阅读 7k评论 12

封面图
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs32阅读 3.5k评论 5

封面图
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城29阅读 6.4k评论 5

封面图
2022大前端总结和2023就业分析
我在年前给掘金平台分享了《2022年热点技术盘点》的前端热点,算是系统性的梳理了一下我自己对前端一整年的总结。年后,在知乎上看到《前端的就业行情怎么样?》,下面都是各种唱衰前端的论调,什么裁员,外包化...

i5ting27阅读 2.3k评论 4

封面图
深入理解React Diff算法
fiber上的updateQueue经过React的一番计算之后,这个fiber已经有了新的状态,也就是state,对于类组件来说,state是在render函数里被使用的,既然已经得到了新的state,那么当务之急是执行一次render,得到持有新...

nero31阅读 11.8k评论 3

念念不忘,必有回响。

117 声望
8 粉丝
宣传栏