這是今天的面試題,其實不難,但是今天狀態真的是差的要死,最后跪了,前端虐我千百遍,我待前端如初戀。只想說找工作累。
function getQueryObject(url) { url = url == null ? window.location.href : url; var search = url.substring(url.lastIndexOf("?") + 1); var obj = {}; var reg = /([^?&=]+)=([^?&=]*)/g; search.replace(reg, function (rs, $1, $2) { var name = decodeURIComponent($1); var val = decodeURIComponent($2); val = String(val); obj[name] = val; return rs; }); return obj; }
這是網上目前最流行的一種做法。我來解釋一下,主要是正則。
首先將字符串進行分割以“?”為分界線,當然我們在進行分割的時候要將得到的索引加一,不然會把這個?也包含進去。
然后主要就是正則了。我們主要匹配的東西都是以query=name的形式存在,然后中間以&進行連接。那么我們的value和那么一般定義為除?&=之外的其他任何字符。
+代表匹配一個或多個,零個肯定是不行的。*代表0個或多個,這里value沒有是允許的。那么這里要注意的就是^在單獨使用時,代表以什么開頭,在中括號里面使用代表不包含的意思。正則基本就是這么多了。
下面就是replace這個方法了,第一個參數就是要進行匹配的字符串,可以使字符串也可以是正則表達式。而后面可以使替換的字符串,也可以是一個函數。其中rs表示匹配成功的字符串序列,$1,表示第一個()內所匹配的內容,$2為第二個,依次類推。當我們使用全局匹配時,只要匹配成功的子串最后都會執行一遍function函數。詳細鏈接
decadeURIComponent就是url字符轉碼。
