if,明明是true,走的却是else

   let value = "0"
   const reg = /\d/g;
   value = value - 0
   console.log("判定", reg.test(value));
   if (reg.test(value)) {
      console.log("进入了true")
      // callback();
   } else {
      console.log("进入了false")
      // return callback(new Error("请输入正确的电话"));
   }
打印出来的是
判定 true
进入了false

这是为什么啊,感觉世界崩塌了

出现类似问题可以从两个方面考虑
1、多线程运行了
2、语句重复执行了

因为lastIndex索引值会修改

1.当console.log("判定", reg.test(value)),执行时,第一次lastIndex是0,结果是true,第一次执行完后,会把lastIndex的值加1。

2.当执行if(reg.test(value))时,第二次lastIndex是1,结果是false,此时因为未找到,会将lastIndex重置为0;

举例如果,不断的重复执行reg.test(value),他的结果一会是true,一会又是false。

代码修改方法:

1.去掉console.log("判定", reg.test(value))日志;

2.设置lastIndex = 0,**推荐这个**

console.log("判定", reg.test(value));
   reg.lastIndex = 0;
   if (reg.test(value)) {
      console.log("进入了true")
   } else {
      console.log("进入了false")
   }
  1. 实际上既不是true也不是false,你可以试一下修改if代码:
if (reg.test(value ) === true) {
  console.log('true');
}else if(reg.test(value ) === false) {
  console.log('false');
}else {
  console.log('其它');
}

打印出来是:其它

  1. 解决方法也很简单: 把表达式校验改为:const reg = /\d/ 去掉全局匹配就行。

首先,const reg = /\d/g;声明的正则表达式(g)为全局匹配模式,简单来说,全局匹配模式就是对指定校验字符串的多次校验,每一次校验会改变它的 lastIndex 值, lastIndex 属性的初始值为0,每次找到匹配的项后,**lastIndex** 的值就被重置为匹配内容的下一个字符在字符串中的位置索引,用来标识 下次执行匹配时开始查找的位置 。如果找不到匹配的项 lastIndex 的值会被设置为0。有可能你还是很迷,让我们看看你的代码,在你的代码中,console.log("判定", reg.test(value));即为第一次校验,执行完该代码之后, lastIndex 值将从0变为1,if (reg.test(value))为第二次校验,此时 lastIndex 已经变为1了,你还记得 lastIndex 的作用是什么吗?(用来标识 下次执行匹配时开始查找的位置 ),所以下次当然校验不到了。至于为什么会出现前面回答中提到的既不是 true 也不是 false 的原因,这是因为: else if 中又做了一次校验,前文中也有提到,即:如果找不到匹配的项 lastIndex 的值会被设置为0,所以校验值会在 truefalse 之间变化。
说完出现这些情况的原因,我给出两种解决方法:
1 不使用全局校验,这是最简单的方法了,如果不使用全局校验, lastIndex 在每次的检验中都为0
2 如果还想使用全局校验,那就把console.log("判定", reg.test(value));这行代码删掉

给出我的测试代码:
1 仍使用全局校验

      let value = 0;
      const reg = /\d/g;
      console.log(value);
      // console.log(reg.lastIndex);
      // console.log(reg.test(value));
      // console.log(reg.lastIndex);
      if (reg.test(value)) {
        console.log("进入了true");
        // callback();
      } else {
        console.log("进入了false");
        // return callback(new Error("请输入正确的电话"));
      }

2 不使用全局校验

      let value = 0;
      const reg = /\d/;
      console.log(value);
      console.log(reg.lastIndex);
      console.log(reg.test(value));
      console.log(reg.lastIndex);
      if (reg.test(value)) {
        console.log("进入了true");
        // callback();
      } else {
        console.log("进入了false");
        // return callback(new Error("请输入正确的电话"));
      }