看到用下面的函數來取得url的值。
function getURLParameter(name) { return decodeURI( (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1] ); }
但是不知道[,null]在這裡是什麼表達方式。
這個函數的作用是想取得URI中某個參數的值,如網址http://www.xxx.com/index.html?key=hello&value=world*,此時的location.search等於?key=hello&value=world。例如要取得key的值("hello"),呼叫getURLParameter("key")就行。
http://www.xxx.com/index.html?key=hello&value=world*
location.search
?key=hello&value=world
key
getURLParameter("key")
exec的語法如下:
如果匹配,則返回結果是一個數組,數組的第一個元素是匹配的子串,後面的元素則依次是捕獲型括號的內容,由正則表達式可見,我們需要的結果是第一個捕獲型括號的內容,是陣列的第二個元素,所以使用了[1];
[1]
舉例來說,假設網址還是上面的網址,我們呼叫getURLParameter("key"),匹配的結果是["key=hello&", "hello", "&"],"key=hello& "是配對的子字串,"hello"是第一個捕獲型括號的內容,"&"是第二個捕獲型括號的內容。 ["key=hello&", "hello", "&"] || [,null]的結果當然是前一項,也就是["key=hello&", "hello", "&"] , 然後取[1],整個函數的回傳值就是"hello"。
["key=hello&", "hello", "&"]
"key=hello& "
"hello"
"&"
["key=hello&", "hello", "&"] || [,null]
但是,如果我們呼叫getURLParameter("time"),匹配失敗,所以結果是null,此時如果你呼叫[1]就會報錯。 [,null]表示[undefined, null],當匹配失敗的時候,就變成了null || [undefined, null]這個結果是[undefined, null],此時再這個結果是[undefined, null],此時再這個結果是
getURLParameter("time")
[,null]
[undefined, null]
null || [undefined, null]
這個結果是
,此時再
,此時再 [1]就不會報錯了,此時整個函數回傳的是
偷懶的做法,(name + '=' + '(.+?)(&|$)').exec(location.search)如果匹配成功。結果不會null。 (.+?)就是正規匹配的值[1]。而如果匹配失敗,exec返回null。 [,null]第一個值為undefined,這個操作只是統一了返回值為null,關鍵還是最後面的[1]導致的如果後面的是[0],那[,null]可以改寫為[null]
(name + '=' + '(.+?)(&|$)').exec(location.search)
(.+?)
undefined
[0]
[null]
[,null][1]不就是null了嗎,前面的配對不到就回傳null
相當於這樣吧
return decodeURI( ( RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) )[1] || null );
但是前面( RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) )這一段如果沒有取得到參數值,直接取[1]會報錯,所以後面加[,null],相當於[undefined, null],在最後取[1],可以確保不會因為取得不到url參數而發生陣列越界錯誤
這個函數的作用是想取得URI中某個參數的值,如網址
http://www.xxx.com/index.html?key=hello&value=world*
,此時的location.search
等於?key=hello&value=world
。例如要取得key
的值("hello"),呼叫getURLParameter("key")
就行。exec的語法如下:
如果匹配,則返回結果是一個數組,數組的第一個元素是匹配的子串,後面的元素則依次是捕獲型括號的內容,由正則表達式可見,我們需要的結果是第一個捕獲型括號的內容,是陣列的第二個元素,所以使用了
[1]
;舉例來說,假設網址還是上面的網址,我們呼叫
getURLParameter("key")
,匹配的結果是["key=hello&", "hello", "&"]
,"key=hello& "
是配對的子字串,"hello"
是第一個捕獲型括號的內容,"&"
是第二個捕獲型括號的內容。["key=hello&", "hello", "&"] || [,null]
的結果當然是前一項,也就是["key=hello&", "hello", "&"]
, 然後取[1]
,整個函數的回傳值就是"hello"
。但是,如果我們呼叫
[undefined, null]getURLParameter("time")
,匹配失敗,所以結果是null,此時如果你呼叫[1]
就會報錯。[,null]
表示[undefined, null]
,當匹配失敗的時候,就變成了null || [undefined, null]
這個結果是[undefined, null]
,此時再這個結果是
[undefined, null],此時再
這個結果是,此時再
null🎜。 🎜 🎜調用完🎜getURLParameter🎜函數以後,可以透過判斷回傳值是否為null,如果是null,則表示URL中沒有這個參數;不為null,則傳回值就是需要的參數值。 🎜[1]
就不會報錯了,此時整個函數回傳的是偷懶的做法,
(name + '=' + '(.+?)(&|$)').exec(location.search)
如果匹配成功。結果不會null。(.+?)
就是正規匹配的值[1]
。而如果匹配失敗,exec返回null。[,null]
第一個值為undefined
,這個操作只是統一了返回值為null,關鍵還是最後面的[1]
導致的如果後面的是
[0]
,那[,null]
可以改寫為[null]
[,null][1]不就是null了嗎,前面的配對不到就回傳null
相當於這樣吧
但是前面( RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) )這一段如果沒有取得到參數值,直接取[1]會報錯,所以後面加[,null],相當於[undefined, null],在最後取[1],可以確保不會因為取得不到url參數而發生陣列越界錯誤