`

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

    博客分类:
  • js
阅读更多

如果能用字面量创建正则就最好不过,显然有时我们不得不使用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">

分享到:
评论

相关推荐

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

    为了优化程序性能,我们可以利用数组缓存来存储已经创建的正则表达式,避免重复构建,从而提升程序效率。本文将探讨如何在JavaScript中实现这一优化策略。 首先,我们要明白,直接使用字面量创建正则表达式(如`/...

    正则表达式、其他API

    ### 正则表达式 #### 正则表达式概述 正则表达式是一种强大的文本处理工具,能够帮助程序员实现对字符串的有效验证与处理。在多种编程语言中都有应用,包括但不限于Java、Python、JavaScript等。 #### 正则表达式...

    正则表达式的详细介绍

    4. **预编译与缓存**:使用字面量创建的正则表达式会被预先编译并缓存,提高性能。而使用构造函数创建的正则表达式每次都会重新编译。 5. **正向和否定查找**:`(?=...)` 是正向前瞻,确保接下来的部分匹配某个模式...

    javascript正则表达式

    JavaScript正则表达式是编程语言JavaScript中的一个重要组成部分,它用于处理文本字符串,执行模式匹配、查找、替换等操作。在JavaScript中,正则表达式是一种强大的工具,可以帮助开发者高效地处理字符串数据。以下...

    06 - Fetch、filter、正则表达式实现快速古诗匹配.rar

    在本课程"06 - Fetch、filter、正则表达式实现快速古诗匹配"中,我们将探讨如何利用JavaScript中的核心特性来实现一个高效且灵活的古诗搜索功能。这一技术适用于网页应用,可以让用户快速找到与关键词匹配的古诗。...

    SimpleRegexLanguage的JavaScript版本

    **JavaScript中的正则表达式(Regular Expressions)** 在JavaScript中,正则表达式是一种强大的文本处理工具,用于模式匹配和字符串操作。"SimpleRegexLanguage的JavaScript版本"可能是指一个简化版的正则表达式库...

    深入浅析正则表达式 捕获组

    正则表达式是一种在文本中进行模式匹配的强大工具,而捕获组是正则表达式中一个非常重要的概念。捕获组的主要作用是提取字符串中符合特定模式的部分,以供后续使用。理解捕获组的原理和使用方法对于掌握正则表达式至...

    Wrox.Professional.JavaScript.for.Web.Developers.2012

    4. **数组和正则表达式**:JavaScript中的数组处理和正则表达式是开发中常用的工具。书中会介绍数组的方法,如push、pop、slice等,以及正则表达式的模式匹配和替换功能。 5. **DOM操作**:DOM(文档对象模型)是...

    JavaScript教程--从入门到精通

    在JavaScript中,数组和正则表达式也是经常使用的工具。数组提供了多种方法来操作和检索数据,而正则表达式用于模式匹配和字符串操作。 最后,随着Web开发的复杂性增加,模块化变得越来越重要。CommonJS和ES6模块...

    易语言正则取Json数据源码-易语言

    源码可能包含一些优化技巧,比如预编译正则表达式、缓存结果、避免不必要的匹配等。 8. **实际应用示例**:源码可能会包含一个或多个实际的应用场景,如从网络响应中提取JSON数据,或者读取本地JSON文件。 了解...

    《JavaScript权威指南》中文第四版(PDF)

    对于数组和正则表达式,作者也进行了详尽的阐述,这些都是日常开发中频繁使用的工具。 除此之外,书中还涉及到了JavaScript与DOM的交互,这是Web开发中的重要一环。如何通过JavaScript操作HTML元素,实现动态效果和...

    java_js_jquery_php_正则.rar

    这个手册可能包括变量、数据类型、控制流、函数、对象、数组、字符串、正则表达式等核心概念,还有闭包、原型链等高级主题,对于JavaScript开发人员来说是重要的参考资料。 【jQuery手册】:"jquery1.8.3_20121129....

    JavaScript权威指南(第6版)

    本书全面覆盖了JavaScript的核心语法、函数、对象、数组、字符串、正则表达式、DOM操作、BOM处理、事件处理以及错误处理等方面的知识。作为Web开发中的关键语言,JavaScript对于创建动态交互式的网页至关重要。 1. ...

    高性能JavaScript编程1

    字符串和正则表达式是JavaScript中的常见操作,但不当使用可能导致性能瓶颈。本章将介绍如何有效地使用字符串拼接、模式匹配和正则表达式,以及如何避免常见的性能陷阱。 第六章 “响应接口”: 响应式设计是提升...

    2010 最新 javascript 特效 开发手册 chm

    7. **正则表达式**:JavaScript的正则表达式是进行文本匹配和处理的强大工具。手册可能包含正则表达式的语法和常用模式。 8. **错误处理**:良好的错误处理机制是提高代码健壮性的重要部分。手册可能讨论了try......

    JavaScript语言精粹.源代码

    7. **正则表达式**:JavaScript提供了强大的正则表达式支持,用于字符串的匹配、替换和分割。"example_code"可能包含正则表达式的实际应用,如验证用户输入、提取信息等。 8. **ES6及更新版本的新特性**:...

    javascript权威指南第五版

    在第五版中,作者详尽地介绍了ES5(ECMAScript 5)规范,这是当时最新的JavaScript版本,涵盖了变量、数据类型、运算符、控制结构、函数、对象、数组、字符串、正则表达式等基础内容。 1. 变量与数据类型:书中详细...

    JavaScript忍者秘籍源码

    9. **正则表达式**:深入学习JavaScript中的正则表达式,包括匹配模式、分组、替换和边界等高级用法。 10. **错误处理**:理解JavaScript中的异常处理机制,如何使用try...catch语句捕获和处理错误。 11. **性能...

    javascript刷题讲义.rar

    10. **性能优化**:了解JavaScript引擎的工作原理,如V8的优化策略,以及如何编写高性能的代码,例如避免全局变量、减少DOM操作、利用缓存等。 通过LeetCode的练习,不仅可以巩固JavaScript的基础,还能提升解决...

Global site tag (gtag.js) - Google Analytics