test方法 test方法介紹 test方法用於測試字元串參數中是否存在匹配正則表達式模式的字元串 test方法的使用 通過結果可以看出,如果測試字元串參數存在匹配正則表達式模式的字元串則返回true,否則返回false test方法的那些坑 當正則表達式使用了全局匹配時,test方法會出現如下的這 ...
test方法
test方法介紹
RegExp.prototype.test(str)
test方法用於測試字元串參數中是否存在匹配正則表達式模式的字元串
test方法的使用
let reg = /\w/
reg.test('a') // true
reg.test('$') // false
通過結果可以看出,如果測試字元串參數存在匹配正則表達式模式的字元串則返回true,否則返回false
test方法的那些坑
當正則表達式使用了全局匹配時,test方法會出現如下的這種奇怪現象:
let reg = /\w/g
reg.test('ab') // true
reg.test('ab') // true
reg.test('ab') // false
reg.test('ab') // true
可以看到,每輪的第三次匹配返回會變為true,但是,ab
不是都符合reg嗎,返回都應該返回true才對。原因就在於上一節提到過的lastIndex屬性。
我們可以試試每次都運行test方法都打出reg的lastIndex方法:
let reg = /\w/g
reg.lastIndex // 0
reg.test('ab') // true
reg.lastIndex // 1
reg.test('ab') // true
reg.lastIndex // 2
reg.test('ab') // false
reg.lastIndex // 0
reg.test('ab') // true
reg.lastIndex // 1
看看結果,然後回憶下lastIndex的定義,你就明白原因了。
lastIndex屬性是當前表達式匹配內容的最後一個字元的後一位,用於規定下一次匹配的起始位置。
當進入正則表達式全局模式時,每次使用test方法都會從lastIndex開始,匹配從lastIndex開始的子字元串。比如例子中,第二次執行test方法時,此時,lastIndex已經變為2,子字元串為空,所以reg不可能匹配上它。由於子字元串匹配失敗,test方法返回false,並將lastIndex屬性置為0,重新開始一輪迴圈。
避免test中的坑的方法
第一種方法:test方法本身就是用來測試是否存在匹配正則的字元串,不使用全局模式一樣可以實現目的,所以第一種方法就是不適用全局模式。
第二種方法:不將正則對象實例存在變數中,每次直接用正則對象實例調用test方法,不過這種方法對記憶體有所損耗,理論上不建議。