JS基礎拾遺(一)
阿新 • • 發佈:2020-07-01
keydown、keypress、keyup的區別
keydown
任意按鍵按下,按住不放會連續觸發keypress
與keydown基本沒差別,任意按鍵按下,按住不放會連續觸發,觸發順序排在keydown後面keyup
任意按鍵抬起
concat深入理解
concat方法用於連線陣列或字串,連線字串比較雞肋,且不說ES6有模版字串大行其道,ES5的簡單的+
號連線字串也讓concat在字串連線方面毫無優勢可言。
用於連線陣列時,concat方法返回一個新陣列,不會改變原陣列。接收的引數也很自由,可以是一堆陣列元素,也可以是一個或多個數組。
請記住這個準則,concat
會扁平化傳入的最外層陣列,但不會遞迴扁平化
[1,2].concat(3, 4) // 返回[1,2,3,4]
[1,2].concat([3,4]) // 返回[1,2,3,4]
[1,2].concat(3,[4]) // 返回[1,2,3,4]
[1,2].concat([3,[4]]) // 返回[1,2,3,[4]]
[1,2].concat({name: 'zhang'}) // 返回[1,2,{name: 'zhang'}]
[1,2].concat([{name: 'zhang'}]) // 返回[1,2,{name: 'zhang'}]
正則物件的test和exec
正則物件的test用於檢測某個字串是否符合該正則物件的規則,符合返回true
,不符合返回false
。
exec相比test會更復雜一些,它的作用是對某個字串進行正則規則的搜尋匹配,如果能匹配上,返回一個詳情陣列;如果匹配不上,返回null
。
但是這裡有一點複雜的是,對於正則物件,全域性匹配和非全域性匹配的行為表現會略有不同:
-
非全域性匹配的正則物件。無狀態,它無論執行多少次,匹配的結果都是一樣的,都會返回匹配到的第一個結果的詳情(比如下標,被檢測的字串等);
-
全域性匹配的正則物件。有狀態,它更類似於那種一步步匹配的邏輯:匹配到第一個就停下來,再次執行則匹配下一個,再次執行則繼續匹配下一個......,當匹配完最後一個時,就返回開始位置,重新匹配第一個。這種行為很類似生活中的一個場景:比如網易雲音樂的迴圈播放某個歌單
// 非全域性匹配的正則物件,重複執行結果不變
const exp = /ok/;
exp.lastIndex // 0
exp.exec('are you ok? I am very ok') // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
exp.lastIndex // 0
exp.exec('are you ok? I am very ok') // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
exp.lastIndex // 0
// 全域性匹配的正則物件,每次執行都會動態更新自身狀態
const globalExp = /ok/g;
globalExp.lastIndex // 0
globalExp.exec('are you ok? I am very ok'); // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
globalExp.lastIndex // 10
globalExp.exec('are you ok? I am very ok'); // ["ok", index: 22, input: "are you ok? I am very ok", groups: undefined]
globalExp.lastIndex // 24
globalExp.exec('are you ok? I am very ok'); // null
globalExp.lastIndex // 0
寫在最後
總結:
- keydown先於keypress觸發,兩者表現類似
- concat對入參會進行一層扁平化
- exec用於搜尋字元匹配詳情,全域性正則有狀態,非全域性正則無狀態
工作已經兩年了,需要對知識進行梳理學習,不要因為有一些東西基礎就視而不見,也不要因為一些基礎高階就趨之若鶩,眼高手低。希望今年自己能更加耐心,沉下心來思考,不要浮躁。