正则-关于一个结果不确定现象怪的研究(reg.test(‘-1’))
先看下边代码
var value = '-1';
var reg = /^-{0,1}\d+$/g;
debugger;
if (reg.test(value)||reg2.test(value)) {
//your logic code.
}
我们在用上边代码在debugger处去监视,在浏览器的控制台上,我们就看到了下边这两张图上的现象


现象解说:
首先,我们应该要了解的一个知识点是:
正则.test()等几乎所有正则对象的方法都会记忆上次正则到的位置,在下次匹配同一个对象(同一个静态值有可能会被视为同一个对象)时,会从这个位置开始向后继续查找,于是,如下资料:
正则匹配全局后 lastIndex会加1,下一次匹配会变成从第二位开始,而你test里面只有1位,所以匹配失败,匹配失败后lastIndex会变成0,再下一次匹配从第一位开始,匹配成功.....
要么去掉/g,要么手动把reg.lastIndex=0
基于以上认识,我们应该想到:
var reg = /^-{0,1}\d+$/g;
reg.test(value)或者reg.test('-1')这种写法中,value或静态值(固定值)都将可能被视为同一个对象,展示给解释器的几乎可以认为是同一个对象,那么,问题来了,reg是一个固定指向的对象(指向的内存资源是同一个),去验证的对象也是一个固定指向的对象(指向的内存资源是同一个),这时,正则对象中的lastIndex属性将会是恒有效的,
于是,
当我们第一次调用reg.test('-1')时,lastIndex=0,于是,返回true
当我们第二次调用reg.test('-1')时,lastIndex=2(索引1位置已被上次的匹配项占用),于是,返回false,此时,由于索引超界,会被正则对象重置回0
当我们第三次调用reg.test('-1')时,lastIndex=0,于是,返回true
……
至于(/^-{0,1}\d+$/g).test('-1')这种写法,因为(/^-{0,1}\d+$/g)每次调用都相当于新声明一个对象,所以每次都成立
至于eval("/^-{0,1}\d+$/g").test('-1')这种写法,代用w3school中的一句话“虽然 eval() 的功能非常强大”,但是实际上eval转义出来的是object类型的对象,你提取其中的一些属性或者执行些动态语句还行,更多的,你暂时就别寄希望于一个object.test()方法能得到个啥东东了,看下图,对eval的写法还是打消任何想法吧

为了验证我们上边的猜想,我们做了个实验,同样是在浏览器控制台中,我们得到了下边这张图:

从图上看,我们的猜想是成立的。
正则-关于一个结果不确定现象怪的研究(reg.test(‘-1’))的更多相关文章
- route 一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机
一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机. [root@NB Desktop]# route ...
- Java 正则判断一个字符串中是否包含中文
使用正则判断一个字符串中是否包含中文或者中文字符 代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...
- Asp.Net正则过滤一个div
Asp.Net过滤一对标签,例如div.ul.p.li.span等 html = “html page”; Regex regPage = new Regex(@"(?is)<div\ ...
- js正则取出一个字符串小括号中的内容
var aa="ldfjsldfj(dsfasjfj3124123)"; var result = aa.match(/\(([^)]*)\)/); // 此时result=[&q ...
- frida的js脚本处理正则的一个小坑
frida的server模式需要python支持,所以js脚本中的正则需要多一次转义 比如匹配"/proc/{数字pid}" server: paramPath.match(&qu ...
- js正则获取图片的src属性及正则分割一个字符串
try{ var str='<P>xczxzxzxcxcxc<IMG src="http://file.ynet.com/2/1612/12/12119048.jp ...
- js 经典正则判断 一个字符串是否包含另一个字符串
if (!new RegExp(list_table[i].value.split("—")[0]).test(lhtj)) { }判断在lhtj中是否包含list_table[i ...
- sed 正则的一个小问题
有一段类似以下的文本 aabbccc test[3307]112323553-66778tp aooppx69tp ooppsg aabbccc test[3307]1127233-6674tp bo ...
- python 利用正则构建一个计算器
该计算器主要分为四个模块: weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式: add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值 ...
随机推荐
- 教你如何修改运行中的docker容器的端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- linux重启Oracle服务
linux重启oracle服务命令(完整版) (1) 以oracle身份登录数据库,命令:su – oracle (2) 进入Sqlplus控制台,命令:sqlplus /nolog (3) 以系统管 ...
- springmvc 配置之 mvc:default-servlet-handler
配置dispatchServlet的方法一般是: <servlet> <servlet-name>mvc-servlet</servlet-name> <se ...
- 【winform】serialPort 串口
一. 1.串口通信简单实现 该来的总会来的,学做硬件的,串口这个东西必须得门清. 俗话说的好,不会做串口助手的电子工程师不是好程序员.
- es6中的模块化
在之前的javascript中是没有模块化概念的.如果要进行模块化操作,需要引入第三方的类库.随着技术的发展,前后端分离,前端的业务变的越来越复杂化.直至ES6带来了模块化,才让javascript第 ...
- ubuntu 17.10 安装mvn
首先,我用的系统是Ubuntu17.10,编辑器用的 vim ,Maven以 3.5.0为例 第一步,去官网下载maven. 官网下载页面.png 第二步,解压到/opt/maven目录(我安装在这个 ...
- BIOS备忘录之SPI(fingerprint)设备
Reset和INT信号使用的是GPIO功能,需要显式的使用(INT信号使用了GPIO的int number,RST信号使用了GPIO的absolute number): 问题举例 漏电导致功能异常:在 ...
- flask、tornado、BaseHTTPServer性能简单对比
最近写了一个web应用,分别用flask.tornado.BaseHTTPServer都实现了一次,顺便就对比了一下三者的性能,本结果仅对本次测试负责(这句话很内涵,值得推广). 测试工具用了ab,时 ...
- CEF JS实现获取剪贴板图片的DataURL
转载:https://www.deanhan.cn/js-paste-upload.html 转载:https://segmentfault.com/a/1190000002915597 转载:htt ...
- Java利用TCP编程实现简单聊天室
前言: 本文是我在学习尚学堂JAVA300集第二季网络编程部分仿照视频内容实现而成 具体可以去尚学堂官网观看视频学习 一.实现思路 实现聊天室的最核心部分就是JAVA的TCP网络编程. TCP 传输控 ...