我的编程空间,编程开发者的网络收藏夹
学习永远不晚

js的cookie怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

js的cookie怎么使用

本篇内容主要讲解“js的cookie怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js的cookie怎么使用”吧!

    源码分析

    使用

    根据README,我们可以看到js-cookie的使用方式:

    // 设置Cookies.set('name', 'value');// 设置过期时间Cookies.set('name', 'value', { expires: 7 })// 获取Cookies.get('name') // => 'value'// 获取所有Cookies.get() // => { name: 'value' }// 获取指定域名下Cookies.get('foo', { domain: 'sub.example.com' })// 删除Cookies.remove('name')

    还有很多其他用和配置说明,大家可以自己去看看。

    源码

    js-cookie的源码并不多,class="lazy" data-src目录下的api.mjs就是我们要分析的源码,只有一百行左右。

    import assign from './assign.mjs'import defaultConverter from './converter.mjs'function init (converter, defaultAttributes) {  function set (name, value, attributes) {    if (typeof document === 'undefined') {      return    }    attributes = assign({}, defaultAttributes, attributes)    if (typeof attributes.expires === 'number') {      attributes.expires = new Date(Date.now() + attributes.expires * 864e5)    }    if (attributes.expires) {      attributes.expires = attributes.expires.toUTCString()    }    name = encodeURIComponent(name)      .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)      .replace(/[()]/g, escape)    var stringifiedAttributes = ''    for (var attributeName in attributes) {      if (!attributes[attributeName]) {        continue      }      stringifiedAttributes += '; ' + attributeName      if (attributes[attributeName] === true) {        continue      }      // Considers RFC 6265 section 5.2:      // ...      // 3.  If the remaining unparsed-attributes contains a %x3B (";")      //     character:      // Consume the characters of the unparsed-attributes up to,      // not including, the first %x3B (";") character.      // ...      stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]    }    return (document.cookie =      name + '=' + converter.write(value, name) + stringifiedAttributes)  }  function get (name) {    if (typeof document === 'undefined' || (arguments.length && !name)) {      return    }    // To prevent the for loop in the first place assign an empty array    // in case there are no cookies at all.    var cookies = document.cookie ? document.cookie.split('; ') : []    var jar = {}    for (var i = 0; i < cookies.length; i++) {      var parts = cookies[i].split('=')      var value = parts.slice(1).join('=')      try {        var found = decodeURIComponent(parts[0])        jar[found] = converter.read(value, found)        if (name === found) {          break        }      } catch (e) {}    }    return name ? jar[name] : jar  }  return Object.create(    {      set: set,      get: get,      remove: function (name, attributes) {        set(          name,          '',          assign({}, attributes, {            expires: -1          })        )      },      withAttributes: function (attributes) {        return init(this.converter, assign({}, this.attributes, attributes))      },      withConverter: function (converter) {        return init(assign({}, this.converter, converter), this.attributes)      }    },    {      attributes: { value: Object.freeze(defaultAttributes) },      converter: { value: Object.freeze(converter) }    }  )}export default init(defaultConverter, { path: '/' })

    分析

    js-cookie的源码并不多,我们先来看看导出的是什么:

    export default init(defaultConverter, { path: '/' })

    这里是直接导出了init函数的返回值,我们来看看init函数的返回值:

    function init (converter, defaultAttributes) {  // ...  return Object.create(    {      set: set,      get: get,      remove: function (name, attributes) {        set(          name,          '',          assign({}, attributes, {            expires: -1          })        )      },      withAttributes: function (attributes) {        return init(this.converter, assign({}, this.attributes, attributes))      },      withConverter: function (converter) {        return init(assign({}, this.converter, converter), this.attributes)      }    },    {      attributes: { value: Object.freeze(defaultAttributes) },      converter: { value: Object.freeze(converter) }    }  )}

    这里是使用Object.create创建了一个对象,这个对象有setgetremovewithAttributeswithConverter这几个方法,这几个方法都是在init函数内部定义的,我们来看看这几个方法的实现:

    set

    function set(name, value, attributes) {    if (typeof document === 'undefined') {        return    }    attributes = assign({}, defaultAttributes, attributes)    if (typeof attributes.expires === 'number') {        attributes.expires = new Date(Date.now() + attributes.expires * 864e5)    }    if (attributes.expires) {        attributes.expires = attributes.expires.toUTCString()    }    name = encodeURIComponent(name)        .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)        .replace(/[()]/g, escape)    var stringifiedAttributes = ''    for (var attributeName in attributes) {        if (!attributes[attributeName]) {            continue        }        stringifiedAttributes += '; ' + attributeName        if (attributes[attributeName] === true) {            continue        }        // Considers RFC 6265 section 5.2:        // ...        // 3.  If the remaining unparsed-attributes contains a %x3B (";")        //     character:        // Consume the characters of the unparsed-attributes up to,        // not including, the first %x3B (";") character.        // ...        stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]    }    return (document.cookie =        name + '=' + converter.write(value, name) + stringifiedAttributes)}

    一行一行来看:

    if (typeof document === 'undefined') {    return}

    首先判断是否有document对象,如果没有则直接返回,这说明js-cookie只能在浏览器环境下使用。

    attributes = assign({}, defaultAttributes, attributes)

    然后合并配置项,将defaultAttributes和传入的attributes合并,这里的assign大家直接理解为Object.assign就好了。

    if (typeof attributes.expires === 'number') {    attributes.expires = new Date(Date.now() + attributes.expires * 864e5)}if (attributes.expires) {    attributes.expires = attributes.expires.toUTCString()}

    然后判断expires是否是一个数字,如果是数字则将其转换为一个Date对象;

    这里的864e5是一个常量,结尾的e5代表后面加5个0,也就是86400000表示一天的毫秒数。

    然后判断expires是否存在,如果存在则将其转换为UTC时间。

    name = encodeURIComponent(name)    .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)    .replace(/[()]/g, escape)

    这里对name进行了编码,然后将name中的%()进行了转义。

    escape是一个内置函数,它的作用是将一个字符串转换为UTF-8编码的字符串,这里的escape是将()转换为%28%29

    参考:escape()

    var stringifiedAttributes = ''for (var attributeName in attributes) {    if (!attributes[attributeName]) {        continue    }    stringifiedAttributes += '; ' + attributeName    if (attributes[attributeName] === true) {        continue    }    // Considers RFC 6265 section 5.2:    // ...    // 3.  If the remaining unparsed-attributes contains a %x3B (";")    //     character:    // Consume the characters of the unparsed-attributes up to,    // not including, the first %x3B (";") character.    // ...    stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]}

    这里是将attributes转换为字符串,这里的stringifiedAttributes是一个字符串,最后的结果是这样的:

    stringifiedAttributes = '; path=/; expires=Wed, 21 Oct 2015 07:28:00 GMT'

    最后将namevaluestringifiedAttributes拼接起来,然后赋值给document.cookie

    get

    function get(name) {    if (typeof document === 'undefined' || (arguments.length && !name)) {        return    }    // To prevent the for loop in the first place assign an empty array    // in case there are no cookies at all.    var cookies = document.cookie ? document.cookie.split('; ') : []    var jar = {}    for (var i = 0; i < cookies.length; i++) {        var parts = cookies[i].split('=')        var value = parts.slice(1).join('=')        try {            var found = decodeURIComponent(parts[0])            jar[found] = converter.read(value, found)            if (name === found) {                break            }        } catch (e) {        }    }    return name ? jar[name] : jar}

    get方法的实现比较简单,主要是解析document.cookie,然后将其转换为一个对象,来逐行解析:

    if (typeof document === 'undefined' || (arguments.length && !name)) {    return}

    对比于set方法,这里多了一个(arguments.length && !name)的判断,这里是防止传入空字符串的name

    var cookies = document.cookie ? document.cookie.split('; ') : []

    这里是将document.cookie分割为一个数组,每一项是一个cookie

    var jar = {}for (var i = 0; i < cookies.length; i++) {    var parts = cookies[i].split('=')    var value = parts.slice(1).join('=')}

    这一步是只要cookienamevalue,其他的一些额外附加信息都不需要。

    try {    var found = decodeURIComponent(parts[0])    jar[found] = converter.read(value, found)    if (name === found) {        break    }} catch (e) {}

    这里是将name进行了解码,然后将namevalue存储到jar对象中,如果传入了name,则在找到对应的name后就跳出循环。

    return name ? jar[name] : jar

    最后返回jar对象,如果传入了name,则返回对应的value,否则返回整个jar对象。

    这里的核心是converter.read,这个方法是用来解析value的,这里的converter是一个对象,它有两个方法:

    export default {  read: function (value) {    if (value[0] === '"') {      value = value.slice(1, -1)    }    return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent)  },  write: function (value) {    return encodeURIComponent(value).replace(      /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,      decodeURIComponent    )  }}

    read方法是将value进行解码,write方法是将value进行编码。

    remove

    function remove(name, attributes) {    set(        name,        '',        assign({}, attributes, {            expires: -1        })    )}

    remove方法就是使用set方法将value设置为空字符串,然后将expires设置为-1,这样就相当于删除了cookie

    withAttributes & withConverter

    Object.create({    withAttributes: function (attributes) {        return init(assign({}, defaultAttributes, attributes))    },    withConverter: function (converter) {        return init(assign({}, defaultConverter, converter))    }})

    这两个方法就是用来设置defaultAttributesdefaultConverter的,这两个对象是用来设置cookie的默认属性和默认的converter

    到此,相信大家对“js的cookie怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    js的cookie怎么使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    js的cookie怎么使用

    本篇内容主要讲解“js的cookie怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js的cookie怎么使用”吧!源码分析使用根据README,我们可以看到js-cookie的使用方式:
    2023-07-04

    Vue中如何使用js-cookie

    小编给大家分享一下Vue中如何使用js-cookie,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、安装js-cookiecnpm i -S js-cookie
    2023-06-29

    js怎么设置cookie值

    可以使用JavaScript的document.cookie属性来设置cookie值。例如,要设置名为"username"的cookie值为"John",可以使用以下代码:```document.cookie = "username=Joh
    2023-08-15

    JS中Json字符串+Cookie+localstorage怎么用

    这篇文章给大家分享的是有关JS中Json字符串+Cookie+localstorage怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Json字符串Json主要用于前后端交互,是一种数据格式,相较于Xml
    2023-06-21

    vue3中cookie怎么使用

    这篇“vue3中cookie怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3中cookie怎么使用”文章吧。前
    2023-07-06

    CGI中怎么使用Cookie

    本篇内容介绍了“CGI中怎么使用Cookie”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CGI中使用Cookie在 http 协议一个很大
    2023-06-08

    使用Okhttp3怎么获取Cookie

    本篇文章给大家分享的是有关使用Okhttp3怎么获取Cookie,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。2.1 简介Okhttp是一个快速、高效的网络请求库。详情可以查阅
    2023-05-30

    cookie的概念是什么和怎么使用

    这篇“cookie的概念是什么和怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“cookie的概念是什么和怎么使用”文
    2023-06-27

    JS的Object.defineProperty()怎么使用

    本篇内容介绍了“JS的Object.defineProperty()怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象的定义与赋值经
    2023-07-02
    2024-04-02

    js中的document怎么使用

    在JavaScript中,`document` 是一个内建的对象,代表当前HTML文档的DOM树。我们可以使用它来访问和操作HTML文档的各个元素和属性。以下是一些常见的使用方式:1. 访问元素:可以使用`getElementById()`
    2023-09-14

    js中的document.all怎么使用

    在JavaScript中,document.all是一个特殊的属性,它返回文档中的所有元素集合(类似于数组)。但是,这个属性在现代的Web标准中已经被弃用了,因为它与Web标准的原则相违背。如果你想通过id获取特定的元素,可以使用getE
    2023-10-24

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录