首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议47:避免使用正则表达式的场景

关灯直达底部

正则表达式匹配速度是非常快的。然而,当只搜索文字字符串时正则匹配经常会显得多余,尤其当事先知道了字符串的哪一部分将要被测试时。例如,要检查一个字符串是不是以分号结束,可以使用:


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


当前没有哪个浏览器“聪明”到这个程度,能够意识到这个正则表达式只能匹配字符串的末尾。最终它们所做的将是一个一个地测试整个字符串。每当发现了一个分号,正则表达式就前进到下一个字元($),检查它是否匹配字符串的末尾。如果不是这样,正则表达式就继续搜索匹配,直到搜索了整个字符串。字符串的长度越长(包含的分号越多),它占用的时间也就越长。

在这种情况下,更好的办法是跳过正则表达式所需的所有中间步骤,简单地检查最后一个字符是不是分号:


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


目标字符串很小时,这种方法只比正则表达式快一点,更重要的是,字符串的长度不再影响执行测试所需要的时间。

例如,使用charAt函数在特定位置上读取字符。字符串函数slice、substr和substring可用于在特定位置上提取并检查字符串的值。此外,indexOf和lastIndexOf函数非常适合查找特定字符串的位置,或者判断它们是否存在。所有这些字符串操作函数速度都很快,在搜索那些不依赖正则表达式复杂特性的文本字符串时,它们有助于减小正则表达式带来的性能开销。