JavaScript利用数组缓存正则表达式

如果能用字面量创建正则就最好不过,显然有时我们不得不使用new RegExp()这种大消耗的创建方法,比如语法高亮与排版就大量用到正则表达式,要用到的patten越多,需要的时间就越长,火狐好像是12秒就发出警告,IE就直接假死。这时我们就需要利用组存大法要提高我们程序的性能了。

通常摆在我们眼前的如下两种选择来作为我们的容器,数组或对象。我这里选择前者,前者更轻量一点。下面我们就hasClass函数作性能改进。

原来的写法:

var hasClass = function(ele,cls) {
 return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

虽然简短,但做了太多假设了,因为元素有时是未必有className,这时直接返回false就行了。而且match是返回一个数组,和我们期望的布尔值多少有点出入(它在我以前的程序运行良好,完全拜javascript的自动转换所赐)。我们用search代替match:

var hasClass = function(ele,cls) {
 return ele.className.search(new RegExp('(\\s|^)'+cls+'(\\s|$)') > -1);
}

Prototype.js的实现我比较满意,test方法在所有正则方法中是最轻量的(相反,exec是最重量,最慢,最强大):

 var hasClass = function(el, cls) {
  var classes = el.className;   
  return (classes > 0) ? (classes == cls ||
    new RegExp("(^|\\s)" + cls + "(\\s|$)").test(classes)) : false;
 }

到现在为止,基于正则方法的挖掘可谓改无可改,我们祭出缓存大法:

(function(){
 var c={};
 window.hasClass=function(el, cls){
  if(!c[cls]){c[cls]=new RegExp("(^|\\s)"+cls+"($|\\s)");}
  return el.className && c[cls].test(el.className);
 }
})();

如果这个正则以前创建过,就有以前的,没有再创建,因此在大量匹配的算法中非常有优势。放入闭包中是为了防止命名冲突,谁会料到后面会不会杀出一个同名的全局变量c来?!使用和原来的一样,因为我们是通过window来引用它。

<script type="text/javascript">
 (function(){
  var c=[];
  window.hasClass=function(el, cls){
    if(!c[cls]){c[cls]=new RegExp("(^|\\s)"+cls+"($|\\s)");}
    return !!el.className && c[cls].test(el.className);
  }
 })();
 window.onload = function(){
  var div1 = document.getElementById("test1");
  var div2 = document.getElementById("test2");
  alert(hasClass(div1,"test1"))
  alert(hasClass(div2,"dd"))
 }
</script>
<div id="test1" class="test1">测试</div>
<img src="http://images.cnblogs.com/t_type1.jpg" alt="mm1" id="1" draggable="true">
<img src="http://images.cnblogs.com/t_type2.jpg" alt="mm2" id="test2" draggable="true">
<img src="http://images.cnblogs.com/t_type3.jpg" alt="mm4" id="3" draggable="true">
<img src="http://images.cnblogs.com/t_type5.jpg" alt="mm5" id="4" draggable="true">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值