浅谈js正则之test方法bug篇
网络编程 2021-07-05 10:07www.168986.cn编程入门
其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西
其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西
狼蚁网站SEO优化的代码都是在chrome的F12下调试的,大家可以研究一下
先来看个东西吧。
var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") );
全部是 true 没问题。。
你把 /\d/; 改成 /\d/g; 再试试。
修改
console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") );
全部是 true,这究竟是为什么呢?
这些结果相当有意思,高手自然知道为什么,如果你知道的话,狼蚁网站SEO优化其实可以跳过不用看了,全是水文而已。。
正则里有一个 lastIndex
的属性,是下一次匹配的开始位置。
var re = /\d/g; console.log( re.test("1"), re.lastIndex ); console.log( re.test("1"), re.lastIndex ); console.log( re.test("1"), re.lastIndex ); console.log( re.test("1"), re.lastIndex );
可以看到 第一次匹配结果为 true
表示匹配成功,此时 lastIndex
记录下一次匹配的起始位置为 1。
于是第二次匹配的时候 从 "1" 字符串索引 1 的位置匹配,就匹配失败了,因为这个字符串只有一个字符,他的索引是 0。
而 /\d/g.test("1")
这个为什么每次匹配成功能呢?
因为它直接用正则字面量,相当于每次重新创建一个正则对象,lastIndex
属性的初始值是 0。
所以每次都能匹配成功。
现在是不是理解了,包括 exec
也一样,每次匹配一个,lastIndex
记录下次匹配的起始位置。
如果非要用一个正则对象的,那就只有每次 test
前重置 lastIndex
了,这样才能保证他不出意外。
var re = /\d/g; console.log( re.test("1") ); re.lastIndex = 0; console.log( re.test("1") ); re.lastIndex = 0; console.log( re.test("1") ); re.lastIndex = 0; console.log( re.test("1") );
好了,今天修改语法高亮插件花了不少时间,所以水了一篇,望大家海涵。。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程