讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議47:避免使用正則表達式的場景 >

建議47:避免使用正則表達式的場景

正則表達式匹配速度是非常快的。然而,當只搜索文字字符串時正則匹配經常會顯得多餘,尤其當事先知道了字符串的哪一部分將要被測試時。例如,要檢查一個字符串是不是以分號結束,可以使用:


endsWithSemicolon=/;$/.test(str);


當前沒有哪個瀏覽器「聰明」到這個程度,能夠意識到這個正則表達式只能匹配字符串的末尾。最終它們所做的將是一個一個地測試整個字符串。每當發現了一個分號,正則表達式就前進到下一個字元($),檢查它是否匹配字符串的末尾。如果不是這樣,正則表達式就繼續搜索匹配,直到搜索了整個字符串。字符串的長度越長(包含的分號越多),它佔用的時間也就越長。

在這種情況下,更好的辦法是跳過正則表達式所需的所有中間步驟,簡單地檢查最後一個字符是不是分號:


endsWithSemicolon=str.charAt(str.length-1)==";";


目標字符串很小時,這種方法只比正則表達式快一點,更重要的是,字符串的長度不再影響執行測試所需要的時間。

例如,使用charAt函數在特定位置上讀取字符。字符串函數slice、substr和substring可用於在特定位置上提取並檢查字符串的值。此外,indexOf和lastIndexOf函數非常適合查找特定字符串的位置,或者判斷它們是否存在。所有這些字符串操作函數速度都很快,在搜索那些不依賴正則表達式複雜特性的文本字符串時,它們有助於減小正則表達式帶來的性能開銷。