replace使用正則表達式和function替換
js代碼
html代碼
場景描述
輸入不同數量的人名,根據不同的人數打印不同的描述
代碼分析
首先在js代碼中使用templates定義了5個模板,通過 var idx = Math.min(names.length, 4)根據人數獲取對應的模板的索引,通過 return templates[idx].replace(/{name}|{others}/g, function(val){ console.log(val) return val === ‘{name}’?names.shift():names.length })替換模板對應的位置,輸出結果
首先在對應位置打斷點進行調試
分別在9、11、12三個位置打上了斷點,運行console.log(likes([‘John’]))時獲取的idx為1,即使用模板一,通過正則表達式/{name}|{others}/g去匹配對應的數據,其中|代表或者,代表全局替換
當到達11時打印val
劃重點:可見val就是需要匹配的字段
由此說明,當使用正則表達式且replace第二個參數為function時,function的接收的參數就是需要匹配的字段,并且將由function的返回值替換匹配的字段,就可以通過判斷val的值進行不同的操作
其中return val === ‘{name}’?names.shift():names.length這段代碼的細節之處在于,可以通過names下標去返回需要替換的值,但是這樣做的話在替換others時就需要進行減法運算,但是如果使用shift(),就不需要進行減法操作了,names.shift() 正則順序是吻合的,直接完美契合!因為shift()的功能是刪除并返回數組的第一個元素。
下圖為運行到console.log(likes([‘John’, ‘Jane’, ‘Andrew’, ‘Jennifer’]))時的數據,由于shift()已經將前兩個數據彈出數組,所以數組的長度完全符合,直接獲取就可以了
總結
replace()方法結合正則表達式,通過自定義的回調函數,可以實現各種復雜的字符串處理需求。