一尘不染

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

javascript

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

很多时候,在构建独立脚本时(我没有任何外部依赖项),我发现自己添加了一个读取cookie的函数,并且通常回退到QuirksMode.orgreadCookie()方法(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;
}

请注意, 这不是一场“ Code Golf”竞赛:我有理由减少我的readCookie函数的大小,并确保我的解决方案有效。


阅读 243

收藏
2020-04-25

共2个答案

一尘不染

比目前最受好评的答案更简短,更可靠,更高效:

function getCookieValue(a) {
    var b = document.cookie.match('(^|[^;]+)\\s*' + a + '\\s*=\\s*([^;]+)');
    return b ? b.pop() : '';
}

(编辑:'(^|;)\\s*'=> '(^|[^;]+)\\s*',以前仅适用于第一个cookie)

有关方法的一些注意事项:

regex方法不仅在大多数浏览器中最快,而且功能最短。此外,应该指出的是,根据正式规范(RFC2109),在document.cookie中用于分隔cookie的分号后的空格是可选的,并且可以提出不应依赖它的论点。另外,在等号(=)之前和之后都允许使用空格,并且可以提出这样的论点,即应将这一潜在的空格纳入任何可靠的document.cookie解析器。上面的正则表达式说明了上述两个空白条件。

2020-04-25
一尘不染

这只会一次击打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;}

如果将其设为110 bytes1个字母的函数名称,90 bytes则可以删除它encodeURIComponent

我已经将其归结为73 bytes,但公平地说,是82 bytes在命名时readCookie以及102 bytes随后添加时encodeURIComponent

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