Javascript中出现意外的无限循环

时间:2017-03-28 23:10:37

标签: javascript loops cookies

我在javascript中进行cookie练习并开发了以下代码:

function getCookie(kname) {
  var fullkeyname = kname + "=";
  var fullcookie = document.cookie;
  var acookies = fullcookie.split(";");
  for (var i = 0; i < acookies.length; i++) {
    var cookie = acookies[i];
    while (acookies[i].charAt(0) == " ") { //THE ISSUE IS HERE
      cookie = cookie.substring(1);
    }
    if(cookie.indexOf(fullkeyname) == 0) {
    return cookie.substring(fullkeyname.length, cookie.length);
  }
}
return "";
}

它没有工作,似乎上升和无限循环,所以我用&#34; document.write&#34;跟踪我的代码。在各个部分发现,如果我改变&#34;而&#34;条件它将如下工作:

function getCookie(kname) {
  var fullkeyname = kname + "=";
  var fullcookie = document.cookie;
  var acookies = fullcookie.split(";");
  for (var i = 0; i < acookies.length; i++) {
    var cookie = acookies[i];
    while (cookie.charAt(0) == " ") { //RIGHT HERE
      cookie = cookie.substring(1);
    }
    if (acookies[i].indexOf(fullkeyname) == 0) {
      return cookie.substring(fullkeyname.length, cookie.length);
    }
  }
  return "";
}

现在我的代码按预期工作,但是我不知道为什么,因为我已经将cookie的值设置为&#34; cookie = acookies [i]&#34;如果我不使用&#34; cookie&#34;我不明白为什么它应该循环不稳定。变量。 问题是:为什么代码适用于我的&#34; cookie&#34;变量而不是&#34; acookies [i]&#34;即使在那个特定的时刻,模具具有相同的价值?

2 个答案:

答案 0 :(得分:2)

它会导致无限循环,因为您正在检查 acookies 的第一个字符是否为空格,如果是,则删除 cookie 的第一个字符(不是 acookies )。因此,如果 acookies 确实有空格作为第一个字符,则while语句将始终为true,因为您没有从 acookies

中删除该空格
function getCookie(kname) {
  var fullkeyname = kname + "=";
  var fullcookie = document.cookie;
  var acookies = fullcookie.split(";");
  for (var i = 0; i < acookies.length; i++) {

    while (acookies[i].charAt(0) == " ") { //THE ISSUE IS HERE
      acookies[i] = acookies[i].substring(1); // FIXED THIS LINE
    }

    var cookie = acookies[i];

    if(cookie.indexOf(fullkeyname) == 0) {
    return cookie.substring(fullkeyname.length, cookie.length);
  }
}
return "";
}

编辑错字,谢谢FREE_AND_OPEN_SOURCE

答案 1 :(得分:0)

我在while循环中看到了一个问题

while (acookies[i].charAt(0) == " ") { //THE ISSUE IS HERE
      cookie = cookie.substring(1);
}

曾经有过eookies [i] .charAt(0)==&#34; &#34;变为现实,它将继续循环,并且永远不会在循环中外出以增加&#39; i&#39;。

的值。

并且在代码的第二个版本中,您正在修改cookie变量本身,这会使while条件为false,从而将控件移出循环并继续执行。