《高性能JavaScript》第五章 字符串和正则表达式
5.1 字符串连接
当连接少量字符串时,这些方法运行速度都很快。随着要合并的字符串长度和数量增加时,有些方法就开始展现优势。
5.1.1 加(+)和加等(+=)操作符
这是一个常见的字符串连接:
str += "one" + "two";
这段代码运行时,会经历四个步骤:
1:在内存中创建一个临时字符串;
2:连接后的“onetwo”被赋值给该临时字符串;
3:临时字符串与str当前的值连接;
4:结果赋值给str。
以下优化会提速10%~40%,原因是这样做避免使用了临时字符串:
--------------------------------------------------------------------
注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687
--------------------------------------------------------------------str += "one";str += "two";等价于str = str + "one" + "two";等价于equivalent to str = ((str + "one") + "two")
5.1.2 数组项合并
Array.prototype.join()方法将数组中的所有元素合并成一个字符串,它接收一个字符串参数为分隔符插入每个元素中间。如果传入的分隔符为空字符"",则可以将数组的所有元素连接起来。
注意:在大多数浏览器中,数组项合并比其他字符串连接方法更慢,而在IE 7以及更早的版本上合并大量字符串唯一高效的方法,谨慎使用。
5.1.3 String.prototype.concat
字符串原生方法concat能接收任意数量的参数,并将每一个参数附加到所调用的字符串上。
// 附加一个字符串str = str.concat(s1);// 附加两个字符串str = str.concat(s1, s2, s3);// 如果传递一个数组,可以附加数组中的所有字符串str = String.prototype.concat.apply(str, array);
注意:遗憾的是,多数情况下concat比使用简单的+和+=稍慢,并且还潜伏着灾难性的性能问题,不建议使用。
5.2 正则表达式优化
本节包含了大量概念以及理解性内容,建议阅读原书。此次只做简单的介绍。
5.2.1 正则表达式工作原理
第一步:编译
当你创建了一个正则表达式对象之后(使用一个正则表达式直接量或者RegExp构造器),浏览器检查你的模板有没有错误,然后将它转换成一个本机代码例程,用于执行匹配工作。如果你将正则表达式赋给一个变量,你可以避免重复执行此步骤。
第二步:设置起始位置
当一个正则表达式投入使用时,首先要确定目标字符串中开始搜索的位置。它是字符串的起始位置,或者由正则表达式的 lastIndex 属性指定,但是当它从第四步返回到这里的时候(因为尝试匹配失败),此位置将位于最后一次尝试起始位置推后一个字符的位置上。
浏览器厂商优化正则表达式引擎的办法是,在这一阶段中通过早期预测跳过一些不必要的工作。例如,如果一个正则表达式以^开头,IE 和 Chrome 通常判断在字符串起始位置上是否能够匹配,然后可避免愚蠢地搜索后续位置。另一个例子是匹配第三个字母是 x 的字符串,一个聪明的办法是先找到 x,然后再将起始位置回溯两个字符(例如,最近的 Chrome 版本实现了这种优化)。
第三步:匹配每个正则表达式的字元
正则表达式一旦找好起始位置,它将一个一个地扫描目标文本和正则表达式模板。当一个特定字元匹配失败时,正则表达式将试图回溯到扫描之前的位置上,然后进入正则表达式其他可能的路径上。
第四步:匹配成功或失败
如果在字符串的当前位置上发现一个完全匹配,那么正则表达式宣布成功。如果正则表达式的所有可能路径都尝试过了,但是没有成功地匹配,那么正则表达式引擎回到第二步,从字符串的下一个字符重新尝试。只有字符串中的每个字符(以及最后一个字符后面的位置)都经历了这样的过程之后,还没有成功匹配,那么正则表达式就宣布彻底失败。
5.2.2 理解回溯
这个表达式匹配“hello hippo”或“happy hippo”。
/h(ello|appy) hippo/.test("hello there, happy hippo");
回溯过程如下:
贪婪量词和惰性量词回溯:
5.2.3 提高效率的方法
1:关注如何让匹配更快失败;
2:表达式以简单、必须的字元开始;
3:使用量词模式,使它们后面的字元互斥;
4:减少分支数量,缩小分支范围;
5:使用非捕获组;
6:只捕获感兴趣的文本以减少后处理;
7:暴露必需的字元;
8:使用合适的量词;
9:把表达式赋值给变量并重用;
10:将复杂的表达式拆分为简单的片段。
《高性能JavaScript》第五章 字符串和正则表达式相关推荐
- Javascript第五章location对象第五课
ECMAScript参考:https://blog.csdn.net/qq_30225725/article/details/88621180 DOM参考:Javascript第五章window对象的 ...
- Javascript第五章history对象第四课
ECMAScript参考:https://blog.csdn.net/qq_30225725/article/details/88621180 DOM参考:Javascript第五章window对象的 ...
- Javascript第五章倒计时第二课
HTML DOM setTimeout() 方法 ECMAScript参考:https://blog.csdn.net/qq_30225725/article/details/88621180 DOM ...
- Javascript第五章DOM简介和window对象第一课
更多免费教学文章请关注这里 ECMAScript参考:https://blog.csdn.net/qq_30225725/article/details/88621180 Javascript第五章w ...
- Python入门基础篇(五)字符串的正则表达式re模块,全面解析!!!
文章目录 前言 一.匹配字符串的方法 1.使用match()方法进行匹配 2.使用search()方法进行匹配 3.使用findall方法进行匹配 二.替换字符串 三.使用正则表达式分割字符串 前言 ...
- 第五章 字符串 总结
目录 5.1 String类 5.1.1 声明字符串 5.1.2 创建字符串 5.2 连接字符串 5.3 提取字符串信息 5.3.1 获取字符串长度 5.3.2 获取指定字符 5.3.3 获取子字符 ...
- 第五章 python中正则表达式的使用
第一节 正则表达式的一些介绍 1)掌握正则表达式的案例 2)写一个小爬虫 3)正则表达式(或RE)是一个小型的.高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实 ...
- 《高性能JavaScript》第二章 数据存取
JavaScript四种数据存储位置: 1:字面量:字面量只代表自身,不存储在特定位置.JavaScript中的字面量有:字符串.数字.布尔值.对象.数组.函数.正则表达式,以及null和undefi ...
- 《高性能JavaScript》第九章 构建并部署高性能JavaScript应用
本章使用到的技术可能已经过时,主要理解其思想.本章的目的是了解如何有效地组织并部署基于JavaScript的Web应用的一些必要知识. 1:Apache Ant:是一个软件构建自动化工具: 2:合并多 ...
最新文章
- 冒号课堂 编程范式与OOP思想
- Oracle 数据库用户锁定与解锁,用户锁定最大密码失败次数设置方法,ORA-28000: the account is locked问题解决方法
- HEXA机器人荣获CES Asia2018 创新奖
- 动态代理和静态代理的区别_代理,是动态和静态的吗?
- windows自动导出oracle数据库,Oracle数据库的自动导出备份脚本(windows环境)
- Asp.Net 之 枚举类型的下拉列表绑定
- Aqua Data Studio 19中文版
- Jsp 购物车(oracle数据库)之初级版
- 《白帽子讲web安全》学习笔记——web安全概述
- 服务于win10的telnet的简易聊天服务器(单进程)
- 玩真的了!深度解读拒不履行信息网络安全管理义务将入罪
- python制作的简单程序_Python如何制作简易收银小程序
- 经典电影台词系列【3】——无间道
- 基本算法总结,力扣题目整理
- 用计算机来解锁密码,电脑忘记开机密码怎么办?如何解锁?
- 交换机Access模式和Trunk模式配置演示
- 手机app抓包,无视SSLPinning
- Google Payments?
- 三国演义告诉我们的60条真理
- U盘病毒查杀并打补丁
热门文章
- 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
- Ⅳ:zookeeper的acl权限控制
- SSM实现个人博客-day04
- vuepress 2.x 集成百度统计
- BugKuCTF 杂项 啊哒
- Robot Cleaner I
- java file源码_java File源码理解,探索File路径
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported
- SQL注入学习——Bool盲注详解 sqli-labs(Less 8)
- Python自省(反射)指南