您好,登錄后才能下訂單哦!
今天小編給大家分享一下JavaScript如何判斷URL是否合法及全排列的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
補全JavaScript
代碼,要求如下:
給"ul
"標簽添加點擊事件
當點擊某"li
"標簽時,該標簽內容拼接".
“符號。如:某"li
"標簽被點擊時,該標簽內容為”..
"
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>事件委托</title></head><body>
<ul>
<li>.</li>
<li>.</li>
<li>.</li>
</ul>
<script type="text/javascript">
// 補全代碼
const ul = document.getElementsByTagName('ul')[0]
ul.onclick = function (e) {
const tar = (e || window.event).target // 如果點擊的對象的名稱是li
// localName 獲取標簽名
if (tar.localName === 'li') {
tar.innerHTML = tar.innerHTML + '.'
}
}
</script></body></html>
這道題挺簡單的,事件委托的原理實際就是利用了事件冒泡的機制。
事件冒泡:在一個對象上觸發某類事件(比如單擊click事件),如果此對象定義了此事件的處理程序,那么此事件就會調用這個處理程序,如果沒有定義此事件處理程序或者事件返回true,那么這個事件就會向這個對象的父級對象傳播,從里到外,直至它被處理(父級對象所有同類事件都將被激活),或者它到達了對象層次的最頂層,即document對象(有些瀏覽器)
在實際開發中,使用事件委托統一由父類捕捉并處理事件,這樣可以減少子類事件的重復定義。
補全JavaScript
代碼,要求以Boolean
的形式返回字符串參數是否為合法的URL
格式。
注意:協議僅為HTTP(S)
const _isUrl = url => {
// 補全代碼
let reg = /^((https|http):\/\/)?(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+([A-Za-z]{2,6})(:\d+)?(\/.*)?(\?.*)?(#.*)?$/g;
return reg.test(url)}
這題就是考察了正則的應用,運用了大量的正則知識,包括:
^
代表開頭
[A-Za-z0-9]
表示匹配大小寫字母和數字
\/
表示匹配/
,因為在正則里/
有其它含義,所以要匹配/
需要在前面使用\
對其進行轉義
?
等價于{0,1}
,表示出現一次或者不出現
+
表示出現的次數至少為1
|
(管道符),是或的意思,表示匹配|
兩邊內容的其中任何之一
\.
表示匹配.
,與/
一樣,要匹配.
需要在前面使用\
對其進行轉義
{n,m}
表示出現n-m次
\d
匹配數字
.
就是[^\n\r\u2028\u2029]
,是通配符,表示幾乎任意字符
*
表示出現次數為0次或者多次
.*
就是匹配任何多個任意字符
$
代表結尾
g
代表全局匹配
合法的URL
格式如下:
協議部分http(s)
可選: 表示為((https|http):\/\/)?
域名部分 :表示為(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+
頂級域名,如com
、cn
等為2-6位:表示為([a-zA-Z]{2,6})
端口部分:表示為(:\d+)?
請求路徑如/login
:表示為 (\/.*)?
問號傳參及哈希值如?age=1
、#dom
:表示為 (\?.*)?
和(#.*)?
補全JavaScript
代碼,要求以數組的形式返回字符串參數的所有排列組合。
注意:
字符串參數中的字符無重復且僅包含小寫字母
返回的排列組合數組不區分順序
示例:
輸入:_permute('abc')
輸出:['abc','acb','bac','bca','cab','cba']
全排列是比較常見的算法之一,解法有很多,這里給大家提供一個很巧妙的解法:
const _permute = string => {
// 補全代
const res = []; // 結果數組
function search(str) {
console.log('1', 'str=' + str);
// 如果長度相等了就存放到結果數組中
if (str.length === string.length) {
res.push(str)
}
// 遍歷string
for (let char of string) {
console.log('2', 'str=' + str, 'char=' + char);
// 如果str內不含char,就使用str+char開始遞歸
if (str.indexOf(char) < 0) {
search(str + char)
}
}
}
search('')
return res;}
整體思路就是運用循環加遞歸,但這個過程中涉及到了JavaScript
中循環的執行機制,我們以執行console.log(_permute('ab'));
為例查看控制臺打印結果:
search
函數中的for
循環執行次數與string
參數的長度相等,此時傳遞的string
參數為ab
,長度為2,即search
函數中的for
循環會執行兩次。
這里需要注意的就是:for
循環中執行的遞歸(再次調用search
函數)并不會中斷當前的for
循環,只會將還未執行的循環暫且擱置,等到系統空閑時這些擱置的循環才會開始執行( javascript
引擎在同一時刻只能處理一個任務,即單線程),具體過程見下方圖解:
以上就是“JavaScript如何判斷URL是否合法及全排列”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。