先看下边代码

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. A Simple Nim (SG打表找规律)

    题意:有n堆石子,每次可以将其中一堆分为数量不为0的3堆,或者从其中一堆中拿走若干个,最终拿完的那个人赢. 思路:直接暴力SG状态,然后找出其中的规律,异或一下每一堆的状态就可以了. #include ...

  2. 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲

    关于Xamarin.Qml.数据绑定.MVC.MVVM 相关的散讲 SURFSKY 2017.02 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它: ()微软去年收购了X ...

  3. CentOS7运行报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

    CentOS内核,对应的文件是/proc/sys/kernel/watchdog_thresh.CentOS内核和标准内核还有一个地方不一样,就是处理CPU占用时间过长的函数,CentOS下是watc ...

  4. 服务器告警其一:硬盘raid问题

    问题描述 服务器一直间断发出告警音,但是根据raid类型的不同有一定可能进入系统. 问题详情 在LSI Mega Webbios自检之后系统开始出现告警音. 在Lsi Mega Webbios的ini ...

  5. css3 box-flex

    应用地址:http://www.jb51.net/css/467291.html box-flex是css3新添加的盒子模型属性,它的出现打破了我们经常使用的浮动布局,实现垂直等高.水平均分.按比例划 ...

  6. 《CSS世界》读书笔记(十六)

    <!-- <CSS世界>张鑫旭著 --> line-height与“垂直居中” line-height 可以让单行或多行元素近似垂直居中,原因在于 CSS 中“行距的上下等分机 ...

  7. java0422 wen 集合框架

  8. VMware下liunx虚拟机仅主机模式上网

    VMware上的配置 虚拟网络编辑器上的仅主机模式设置 可以自定义虚拟机的网段,我设置的是192.168.137.0 选择对应网卡的联网方式为仅主机模式 配置虚拟机网卡,主要是按虚拟网卡编辑器中设置的 ...

  9. centos7 openssl 生成证书给自己使用

    Step1: centos7 系统自己生成证书 给自己签发不安全的域名证书 openssl genrsa - #生成ca根秘钥 是长度 openssl req - -key ca.key -out c ...

  10. JsTree 最详细教程及完整实例

    JsTree是一个jquery的插件,它提交一个非常友好并且强大的交互性的树,并且是完全免费或开源的(MIT 许可).Jstree技持Html 或 json格式的的数据, 或者是ajax方式的动态请求 ...