2017-03-28 54 views
0

我是做在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 ""; 
} 

它沒有工作,似乎在上升,無限循環,所以我找到我的代碼以「文件撰寫」在各種零件和發現,如果我改變「而」條件,將工作如下:

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值設置爲「 cookie = acookies [我]「我不明白爲什麼它應該循環不謹慎,如果我不使用「cookie」變量。 問題是:爲什麼代碼與我的「cookie」變量一起工作,而不是與「acookies [i]」一起工作,儘管在給定的時刻應該具有相同的值?

+0

'ifcookie.indexOf(fullkeyname)== 0)' - 我看到一個缺失的'('在第一個代碼塊。是否是錯字? – curveball

+0

因爲你沒有修改體內的'acookies [i]'當你將'acookies [i]'賦值給變量'cookie'時,你只需設置一個指針;所以賦值'cookie = cookie.substring(1);'不會改變'acookies' ,它只是更新指針 – Hamms

+1

'你只是設置一個指針' - 不,這是不正確的,因爲cookie [i]是一個字符串,'cookie = cookies [i]'**複製**值 - 沒有「指針」,或更準確,引用 –

回答

2

它會導致一個無限循環,因爲要檢查如果acookies第一個字符是一個空的空間,那麼如果是這樣,你要刪除的cookie (NOT acookies)的第一個字符。因此,如果acookies確實有一個空格作爲第一個字符,while語句將永遠是正確的,因爲你不是從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

你的意思是'acookies [i] = acookies [i] .substring(1);' – user7771338

+0

你缺少'(''if'語句之前'。另外,你需要在'while循環之後設置'cookie = acookies [i]'。 – user7771338

+0

的「(」是一個錯字,你是完全正確的。 – LuisE

0

我看到一個問題,而循環

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

一次acookies [I] .charAt(0)==「」爲真,則繼續循環,並永遠不會去Ø utside while循環來增加'i'的值。

,並在代碼的第二個版本,你正在修改的cookie變量本身,這使得當條件爲假移動該控制退出循環並繼續執行。