更快更简短的检查cookie是否存在的方法

5

如何更快更简单地了解一个cookie是否具有值或存在?

我使用以下代码来判断是否存在:

 document.cookie.indexOf('COOKIENAME=')== -1

了解如何判断是否有值

 document.cookie.indexOf('COOKIENAME=VALUE')== -1

有更好的方法吗?这种方法有什么问题吗?

具有值 (表示具有任何值或具有特定的值) - Ry-
2
我将给我的cookie命名为MYCOOKIENAME,并赋值为VALUES。你认为会发生什么? - zzzzBov
如果您检查Cookie中字符串的包含情况,indexOf仅会正确评估,它不匹配完整名称,在这种情况下,上述代码将返回false,从而给出错误的结果。 - Moritz Roessler
如果我们想要检查是否存在具有该名称的Cookie,那么不应该是document.cookie.indexOf('COOKIENAME=') != -1吗? - Esko
3个回答

4

显然:


document.cookie.indexOf("COOKIENAME=VALUE");

对我而言,访问cookie的速度更快,但仅略微快一些。

如测试所示,出乎意料的是,将cookie先拆分成数组甚至更快:

document.cookie.split(";").indexOf("COOKIENAME=VALUE");

对我来说也不是,这取决于浏览器和环境。 - Moritz Roessler

4

我建议编写一个小助手函数,以避免zzzzBov在评论中提到的问题。

  • 你使用indexOf的方式只有在检查cookie中字符串是否包含时才能正确评估,它不匹配完整的名称,在这种情况下,上述代码将返回false,从而给出错误的结果。

function getCookie (name,value) {
    if(document.cookie.indexOf(name) == 0) //Match without a ';' if its the firs
        return -1<document.cookie.indexOf(value?name+"="+value+";":name+"=")
    else if(value && document.cookie.indexOf("; "+name+"="+value) + name.length + value.length + 3== document.cookie.length) //match without an ending ';' if its the last
        return true
    else { //match cookies in the middle with 2 ';' if you want to check for a value
        return -1<document.cookie.indexOf("; "+(value?name+"="+value + ";":name+"="))
    }
}
getCookie("utmz") //false
getCookie("__utmz" ) //true

然而,这种方法似乎有点慢,因此采用另一种方法进行拆分。以下是另外两种可能性。
function getCookie2 (name,value) {
    var found = false;
    document.cookie.split(";").forEach(function(e) {
        var cookie = e.split("=");
        if(name == cookie[0].trim() && (!value || value == cookie[1].trim())) {
            found = true;
        }
    })
    return found;
}

这个例子使用原生的forEach循环和拆分cookie数组。
function getCookie3 (name,value) {
    var found = false;
    var cookies = document.cookie.split(";");
    for (var i = 0,ilen = cookies.length;i<ilen;i++) {
         var cookie = cookies[i].split("=");
         if(name == cookie[0].trim() && (!value || value == cookie[1].trim())) {
              return found=true;
         }
     }
     return found;
};

使用旧的for循环,可以在找到cookie时提前退出循环,这是它的优势。

查看JSPerf结果,前两种方法并不慢,只有在确实存在对应名称或值的cookie时才会返回true。

希望您能理解我的意思。


我正在寻找一种匹配确切名称/值的方法。无论如何,谢谢。 - Martin Borthiry
你的意思是如果有一个名为"MyCookieA"和另一个名为"CookieA"的cookie,当查找CookieA时,你想匹配它们两个? - Moritz Roessler

0

我使用Jquery cookie插件来实现此功能。

<script type="text/javascript" src="jquery.cookie.js"></script>

function isCookieExists(cookiename) {
    return (typeof $.cookie(cookiename) !== "undefined");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接