在JavaScript中的indexOf()函数

3

好的,我开始学习《JavaScript入门第5版》这本书,但是对一段JavaScript脚本感到困惑。

function getCookieValue(name) {
var value = document.cookie;
var cookieStartsAt = value.indexOf(" " + name + "=");
if (cookieStartsAt == -1) {
    cookieStartsAt = value.indexOf(name + "=");
}
if (cookieStartsAt == -1) {
    value = null;
} else {
    cookieStartsAt = value.indexOf("=", cookieStartsAt) + 1;
    var cookieEndsAt = value.indexOf(";", cookieStartsAt);
    if (cookieEndsAt == -1) {
        cookieEndsAt = value.length;
    }
    value = unescape(value.substring(cookieStartsAt,
       cookieEndsAt));
}
return value;}

我想问一下indexOf运算符在这里是如何工作的(我知道它的工作原理并曾经使用过)??上面的程序由以下书籍定义:

该函数的第一个任务是获取document.cookie字符串并将其存储在value变量中。

var value = document.cookie;

接下来,您需要找出将作为参数传递给函数的 cookie 名称在 value 字符串中的位置。您可以使用 String 对象的 indexOf() 方法来查找此信息,如下行所示:

var cookieStartsAt = value.indexOf(" " + name + "=");

该方法将返回单个cookie的字符位置,如果没有该名称或者没有该cookie,则返回-1。您可以搜索“ ”+ name +“=”以便不会无意中找到包含所需名称的cookie名称或值。例如,如果您有xFoo、Foo和yFoo作为cookie名称,那么在没有空格的情况下搜索Foo将首先匹配xFoo,这不是您想要的!
indexOf() 方法是用来查找字符串中某个字符或子字符串第一次出现的位置。在此示例中,我们使用indexOf()方法查找带有“ name =”的子字符串,并返回该子字符串的起始位置。如果找不到该子字符串,则返回-1。
例如,如果您正在查找名为“ Foo”的cookie,则需要搜索“ name = Foo”,而不是只搜索“ Foo”。如果您只搜索“ Foo”,则可能会误匹配其他名称中包含“ Foo”的cookie,例如“ xFoo”和“ yFoo”。

1
看起来像是一个糟糕的教程。也许我错了,但我认为他们读取Cookie的方式不安全,也没有意义。首先,Cookie是由分号分隔的,而且,正如你所说,你可以找到包含cookiename=的Cookie。我会使用var cookies = value.split(';');。之后,你得到了一个数组,其中每个单独的Cookie都是以name=value的格式作为项。他们的方法试图更高效,但在我看来过于复杂,而且不完全可靠。 - GolezTrol
2个回答

3

document.cookie 包含一个类似于 cookiename=cookievalue 的字符串。

indexOf 获取 cookie 值部分的起始位置。

var cookieStartsAt = value.indexOf("cookiename=");

这允许您使用该数字通过 substring() 获取字符串的值部分。


0
使用indexOf函数从指定位置开始的有用功能。
function IndexAt(base,t /*string*/,pos=0) /*int*/ {
 if (pos<0) {pos=0;}
 var x=base.substr(pos);
 var p=x.indexOf(t);
 if (p>=0) { return p+pos;} else {return -1;}
}

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