利用数组缓存正则表达式
如果能用字面量创建正则就最好不过,显然有时我们不得不使用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"> |
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端