getCookie сосёт

Лет 15 назад какой-то кудесник написал следующую функцию на тогда ещё новом языке JavaScript:

function getCookie(name) {
    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((!start) && (name != document.cookie.substring(0, name.length))) {
        return null;
    }
    if (start == -1) return null;
    var end = document.cookie.indexOf(';', len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len, end ));
}

С тех пор она обошла весь интернет и сотню рейтингов типа «10 самых обосраться лучших JavaScript-функций за все времена».

С тех пор все подряд либо тянут её себе, либо, как обычно, переписывают на свою «ещё более лучшую, ведь я программист», но везде впихивают этот грёбаный indexOf().
Чем он вам понравился?
Даже Дэвид Флэнаган в своём «подробном руководстве» не удержался.

indexOf(name + "=") — мы здесь не переменную «name» ищем, мы ищем переменную, заканчивающуюся на «name».
Что следующий код нам вернёт?

setCookie("sex", "yes");
setCookie("x", "no");
 
console.log(getCookie("x"));

Правильно:

sex=yes; x=no;

Ну и escape/unescape совершенно для других целей нужны.

А посему:

function getAllCookie() {
    var parts  = document.cookie.split(";"),
        cookie = {},
        part,
        name,
        value,
        i,
        len = parts.length;
    for (i = 0; i < len; i += 1) {
        part  = parts[i].split("=");
        name  = part[0].replace(/^\s+/, "").replace(/\s+$/, "");
        value = (part[1] || "").replace(/^\s+/, "").replace(/\s+$/, "");
        cookie[name] = decodeURIComponent(value);
    }
    return cookie;
}

3 комментария »

  • ОБОСРАТЬСЯ АФИГЕННЫЙ КОД!!!! РЕЛЬНИ ПОМОГАЕ!

    phpdude, 21.02.2012, 19:50

  • > indexOf(name + «=») – мы здесь не переменную «name» ищем, мы ищем переменную, заканчивающуюся на «name».

    ээ… это первая мысля, когда в код вчитался. это что правда так мало людей за 15 лет заметили? O__o

    SunChaser, 21.02.2012, 22:18

  • SunChaser, заметило, скорее всего не так мало.
    Но и не заметило немало :)

    vasa_c, 22.02.2012, 9:56

Leave a comment