1. 程式人生 > 實用技巧 >JS基礎拾遺(一)

JS基礎拾遺(一)

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用於搜尋字元匹配詳情,全域性正則有狀態,非全域性正則無狀態

工作已經兩年了,需要對知識進行梳理學習,不要因為有一些東西基礎就視而不見,也不要因為一些基礎高階就趨之若鶩,眼高手低。希望今年自己能更加耐心,沉下心來思考,不要浮躁。