天天看點

JS程式設計建議——47:避免使用正規表達式的場景

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

正規表達式比對速度是非常快的。然而,當隻搜尋文字字元串時正則比對經常會顯得多餘,尤其當事先知道了字元串的哪一部分将要被測試時。例如,要檢查一個字元串是不是以分号結束,可以使用:

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

目前沒有哪個浏覽器“聰明”到這個程度,能夠意識到這個正規表達式隻能比對字元串的末尾。最終它們所做的将是一個一個地測試整個字元串。每當發現了一個分号,正規表達式就前進到下一個字元($),檢查它是否比對字元串的末尾。如果不是這樣,正規表達式就繼續搜尋比對,直到搜尋了整個字元串。字元串的長度越長(包含的分号越多),它占用的時間也就越長。

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

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

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

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

繼續閱讀