用正則表示式提取Cookie值
阿新 • • 發佈:2018-12-30
Cookie是以“;”進行分隔的鍵值對字串,因此如果要提取所以的鍵值,我們需要對字串進行“;”與“=”的split(分割)操作,如下:
function initCookie() {
var cookie = document.cookie,
// 第一次分割
items = cookie.split(";"),
keys = {};
items.forEach(function(item) {
// 第二次分割
var kv = item.split('=');
keys[$.trim(kv[0 ])] = $.trim(kv[1]);
});
return keys;
}
從程式碼結構上來看,分割的次數愈多,需要判斷的邏輯就越多,從而堆積了大量的邏輯程式碼,那麼能不能使用正則表示式一次到位呢?
首先從字串的方法來看,search(返回匹配位置)、replace(替換)不滿足需求,match不能進行遞進匹配(lastIndex不會發生遞增),所以字串的所有方法都不合適,從正則表示式的方法來看,exec在結合全域性匹配符使用時,能迴圈遞進元素匹配,正好滿足我們的需求,實現的程式碼如下:
function parseCookie() {
var cookie = document.cookie,
pattern = /([^=]+)=([^;]+);?\s*/g ,
result,
value = {};
while((result = pattern.exec(cookie)) != null) {
value[result[1]] = result[2];
}
return value;
}
與第一種方法相比,減少了空白字元的判斷與去除,並減少了一次匹配(兩次split簡化為一次exec),但是相比與第一種方法,正則表示式的效能遠遠低於字元切割,測試資料見下表。
匹配次數 | 字元切割(ms) | 正則匹配 |
---|---|---|
1 | 0.51 | 0.18 |
10 | 0.72 | 0.41 |
100 | 1.78 | 0.84 |
1000 | 1.68 | 0.86 |
結論
在很多時候,程式碼量雖然變少了,但花費的時間與空間卻有可能大幅增加,同樣在系統架構上,有時擴充套件性、可維護性增強了,但是效能可能有較大的損耗。