先看下边代码

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’))的更多相关文章

  1. route 一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机

    一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机. [root@NB Desktop]# route ...

  2. Java 正则判断一个字符串中是否包含中文

    使用正则判断一个字符串中是否包含中文或者中文字符 代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...

  3. Asp.Net正则过滤一个div

    Asp.Net过滤一对标签,例如div.ul.p.li.span等 html = “html page”; Regex regPage = new Regex(@"(?is)<div\ ...

  4. js正则取出一个字符串小括号中的内容

    var aa="ldfjsldfj(dsfasjfj3124123)"; var result = aa.match(/\(([^)]*)\)/); // 此时result=[&q ...

  5. frida的js脚本处理正则的一个小坑

    frida的server模式需要python支持,所以js脚本中的正则需要多一次转义 比如匹配"/proc/{数字pid}" server: paramPath.match(&qu ...

  6. js正则获取图片的src属性及正则分割一个字符串

    try{     var str='<P>xczxzxzxcxcxc<IMG src="http://file.ynet.com/2/1612/12/12119048.jp ...

  7. js 经典正则判断 一个字符串是否包含另一个字符串

    if (!new RegExp(list_table[i].value.split("—")[0]).test(lhtj)) { }判断在lhtj中是否包含list_table[i ...

  8. sed 正则的一个小问题

    有一段类似以下的文本 aabbccc test[3307]112323553-66778tp aooppx69tp ooppsg aabbccc test[3307]1127233-6674tp bo ...

  9. python 利用正则构建一个计算器

    该计算器主要分为四个模块: weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式: add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值 ...

随机推荐

  1. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  2. WebSphere应用程序更新方式

    在日常的使用中,一个javaee程序部署以后,以后续的使用中会有模块等的更新,但我经常见到有人直接更新服务器上的类包,文件等,(可能是tomcat,jboss这种热部署使用惯了)这样子的方式有几个问题 ...

  3. Oracle树查询及相关函数

    Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Or ...

  4. 信步漫谈之Redis—Linux下环境搭建

    一.环境 Linux 系统:Suse11(SLES-11-SP3-DVD-x86_64-GM-DVD1)Redis 安装包:redis-4.0.11.tar.gz      下载地址:http://d ...

  5. js let

    <script> var a; // 变量提升 js中的作用域只有在函数中 {} 才称为作用域 if/for循环都不是 都会产生变量提升 console.log(a); { a = 2; ...

  6. Haproxy + Keepalived +PXC 常见错误

    1. Apr 21 19:15:54 pxc1 systemd[1]: mysql@bootstrap.service: main process exited, code=exited, statu ...

  7. axios请求

    axios.get('/user?ID=12345') .then(function (response) { console.log(response); console.log(response. ...

  8. Celery完成定时任务

    1.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 celery支持linux,如果windows使用celery ...

  9. P4389 付公主的背包

    注意 初始化的时候要这样写 for(int i=1,x;i<=n;i++){ scanf("%d",&x); v[x]++; } for(int i=1;i<= ...

  10. 前端——Bootstrap

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 以前自己写的html的 ...