当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript下利用数组缓存正则表达式的实现方法

Javascript
一个多浏览器支持的背景变暗的div并可拖动提示窗口功能的代码
CSS也可以把IE6弄死
ibm官方资料把应用程序从 Internet Explorer 迁移到 Mozilla
JavaScript修改css样式style
ext for eclipse插件安装方法
JavaScript对象模型-执行模型
定义select的边框颜色
js放大镜放大图片效果
javascript+css好多网站用的选星星实现打分功能的函数
javascript双向放大缩小广告代码
javascript四个方向无间隙滚动合集(多浏览器IE,firefox兼容)
Js的MessageBox效果代码
页面下沉抖动效果-网站HTTP连接没有效果-PC上有效果
javascript图片渐显效果代码
使用jquery给input和textarea设定ie中的focus
用JS实现一个页面多个css样式实现
用javascript做拖动布局的思路
javascript搜索自动提示功能的实现
多浏览器兼容的qq图片轮换效果javascript代码
javascript 建设银行登陆键盘

Javascript 中的 javascript下利用数组缓存正则表达式的实现方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 202 ::
收藏到网摘: n/a

利用组存大法要提高我们程序的性能,让我们的正则表达式的创建于执行更有效率。 如果能用字面量创建正则就最好不过,显然有时我们不得不使用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来引用它。

[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

注意如果是代替上面的test2的内容
<img src="/upload/tech/20100110/20100110112633_233509073ed3432027d48b1a83f5fbd2.gif" alt="mm2" id="test2" class="dd" draggable="true">将会是true。