JS使用indexOf校验邮箱后缀不含指定字符时逻辑错误如何解决
问题根因分析
String.indexOf()方法的返回值规则:匹配到目标字符时返回≥0的索引值,未匹配到固定返回-1。- JS 隐式布尔转换规则:所有非0数字都会被判定为
true(包括-1),只有0会被判定为false。
你最初单校验usa时功能正常属于巧合:
当后缀包含
usa时,indexOf大概率返回0(usa出现在后缀开头),隐式转布尔为false,不会触发错误展示;当后缀不包含usa时返回-1,隐式转布尔为true,触发错误,刚好匹配你的需求,但这个逻辑是不严谨的。
新增can校验后逻辑失效的原因:
只要两个判断中有一个未匹配到对应字符,就会返回-1转成true,导致无论如何都会触发错误展示。比如后缀包含usa但不包含can时,indexOf('usa')返回0(假),indexOf('can')返回-1(真),或运算结果为真,就会错误触发提示。
正确修改方案
你的需求为后缀既不含usa也不含can时才展示错误,按以下方式修改即可:
方案1:基于indexOf的严谨写法
明确判断两个字符都未匹配到时才触发错误提示:
if(validateemailaddress.indexOf('usa') === -1 && validateemailaddress.indexOf('can') === -1){ $('#emailError').show(); }
方案2:更易读的includes写法(ES6+支持)
直接使用返回布尔值的includes方法,逻辑更清晰不易出错:
if(!validateemailaddress.includes('usa') && !validateemailaddress.includes('can')){ $('#emailError').show(); }
内容的提问来源于stack exchange,提问作者John Beasley
相关产品推荐
相关产品推荐

