在JavaScript中按名称读取cookie的最短函数是什么?

2022-08-30 00:42:42

在 JavaScript 中读取 Cookie 的最短、准确和跨浏览器兼容的方法是什么?

很多时候,在构建独立脚本时(我不能有任何外部依赖项),我发现自己添加了一个用于读取cookie的函数,并且通常回退到 QuirksMode.org readCookie()方法(280字节,216分钟)。

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

它完成了这项工作,但它很丑陋,每次都会增加相当多的膨胀。

jQuery.cookie使用类似如下的方法(修改,165字节,125分钟):

function read_cookie(key)
{
    var result;
    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? (result[1]) : null;
}

请注意,这不是一场“代码高尔夫”竞赛:我对减小readCookie函数的大小以及确保我拥有的解决方案有效感兴趣。


答案 1

比当前投票率最高的答案更短、更可靠、更高性能:

const getCookieValue = (name) => (
  document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)')?.pop() || ''
)

下面显示了各种方法的性能比较:

https://jsben.ch/AhMN6

关于方法的一些说明:

正则表达式方法不仅是大多数浏览器中最快的,而且还产生了最短的功能。此外,应该指出的是,根据官方规范(RFC 2109),在document.cookie中分隔cookie的分号后面的空格是可选的,并且可以提出一个参数,即不应依赖它。此外,在等号 (=) 之前和之后都允许使用空格,并且可以提出一个参数,即任何可靠的 document.cookie 解析器中都应考虑此潜在空格。上面的正则表达式考虑了上述两种空格条件。


答案 2

这只会点击 document.cookie 一次。每个后续请求都将是即时的。

(function(){
    var cookies;

    function readCookie(name,c,C,i){
        if(cookies){ return cookies[name]; }

        c = document.cookie.split('; ');
        cookies = {};

        for(i=c.length-1; i>=0; i--){
           C = c[i].split('=');
           cookies[C[0]] = C[1];
        }

        return cookies[name];
    }

    window.readCookie = readCookie; // or expose it however you want
})();

恐怕真的没有比这个一般逻辑更快的方法了,除非你可以自由使用,这取决于浏览器(即使这样你也不会节省那么多).forEach

你自己的例子稍微压缩到:120 bytes

function read_cookie(k,r){return(r=RegExp('(^|; )'+encodeURIComponent(k)+'=([^;]*)').exec(document.cookie))?r[2]:null;}

如果将其设置为 1 个字母的函数名称,则可以将其设置为 ,如果删除 .110 bytes90 bytesencodeURIComponent

我已经把它归结为,但公平地说,它是在命名时,然后添加:73 bytes82 bytesreadCookie102 bytesencodeURIComponent

function C(k){return(document.cookie.match('(^|; )'+k+'=([^;]*)')||0)[2]}