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、语句重复执行了
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")
}
if (reg.test(value ) === true) {
console.log('true');
}else if(reg.test(value ) === false) {
console.log('false');
}else {
console.log('其它');
}
打印出来是:其它
首先,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,所以校验值会在 true 和 false 之间变化。
说完出现这些情况的原因,我给出两种解决方法:
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("请输入正确的电话"));
}