Cookie增删改查方法封装(低内存开销版)

本文章中的低内存开销是指在获取cookie的时候不进行字符串—>数组的转变,全程使用slice+indexOf切割字符串,不创建和操作数组,节约内存,本文代码已存放到github中,后续会持续完善功能,传送门:https://github.com/Escaay/cookieHandler.git
本文由Escaay原创,转载请注明出处

一、前置知识

0.测试cookie,需要服务器环境,想要在本地完成,需要模拟服务器环境,最快的方法是在vscode扩展中下载Live Server

在这里插入图片描述

然后重启vscode,右键点击图示即可在服务器环境运行代码

在这里插入图片描述

1.cookie是挂在ducument上的,document是一个HTML标签的DOM经过特殊加工的对象,所以我们获取cookie,一般是

let cookie=document.cookie

2.添加cookie,每一次设置document.cookie都会添加cookie,而不是给cookie重新赋值,而且会自动在每个分号之后添加一个空格,例如

document.cookie='username=escaay'
document.cookie='username=xiaoming'
console.log(document.cookie)	
//'username=escaay; username=xiaoming'

3.cookie的value中不能含有;=等特殊字符,如果需要,则借助encodeURIComponent()进行编码后再赋值,取出时用decodeURIComponent解码

let value=;escaay//;是特殊字符
document.cookie=`name=username;value=${encodeURIComponent(value)}`

二、cookie增删改查方法封装

1.添加一个cookie

function setCookie(name, value, maxAge) {
            let cookie = `${name}=${encodeURIComponent(value)}`
            //判断传入过期时间类型,是数字的话就添加到cookie
            if (typeof maxAge==='number') {
                cookie += `;max-age=${maxAge}`
            }
            document.cookie = cookie
        }

2.获取整个对象类型的cookie

function getCookieObject() {
			//cookie为空返回null
            if(!document.cookie.length) return 'cookie为空'
            let result = {}
            //将添加cookie时自动生成的空格去掉,避免后面索引对不上
            let cookieStr = document.cookie.replace(/; /g, ';')
            //为cookie最后添加分号,这样一会循环才能遍历最后一项
            if (cookieStr.slice(-1) !== ';') cookieStr += ';'
            //滑动选取每一项cookie元素
            let startIndex = 0
            let nextStartIndex = 0
            //等号的索引
            let equalIndex = 0
            //当startIndex之后不再有分号时,已经遍历每一项cookie元素
            while (cookieStr.indexOf(';', startIndex) !== -1) {
                equalIndex = cookieStr.indexOf('=', startIndex)
                nextStartIndex = cookieStr.indexOf(';', startIndex) + 1
                let key = cookieStr.slice(startIndex, equalIndex)
                let value = decodeURIComponent(cookieStr.slice(equalIndex + 1, nextStartIndex-1))
                result[key] = value
                startIndex = nextStartIndex
            }
            return result
        }

3.根据名称获取单个cookie的值

function getCookie(name) {
			//未传参则退出函数
            if(!name)  return 'cookie中不存在此键'
            let cookieStr = document.cookie
            if (cookieStr.slice(-1) !== ';') cookieStr += ';'
            let startIndex=cookieStr.indexOf(`${name}=`)
            if(startIndex===-1) return 'cookie中不存在此键'
            startIndex+=name.length+1
            let endIndex=cookieStr.indexOf(';',startIndex)
            return decodeURIComponent(cookieStr.slice(startIndex,endIndex))
        }
}

4.根据名称删除单个cookie

function deleteCookie(name){
            setCookie(name,'',0)
            console.log(`cookie中${name}删除成功`)
        }

5.清除cookie

function clearCookie(){
            let cookieObj=getCookieObject()
            Object.keys(cookieObj).forEach((v,i)=>{
                deleteCookie(v)
            })
            console.log('cookie清除成功')
        }

测试代码

        //test
        setCookie('username', 'escaay;;;')
        setCookie('phone', '88888')
        console.log('getCookieObject:  ',getCookieObject())
        console.log("getCookie('username'):  ",getCookie('username'))
        deleteCookie('username')
        console.log('getCookieObject:  ',getCookieObject())
        console.log("getCookie('username'):  ",getCookie('username'))
        clearCookie()
        console.log('getCookieObject:  ',getCookieObject())

测试结果
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Feng Wuqian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值