创建电话号码验证项目 ,出现一个无法理解的问题

告诉我们发生了什么:

关于 创建电话号码验证项目,出现一个无法理解的问题。

中间这个checkStr函数是用于检测电话号码是否符合格式的函数,该函数在当前状态下能正确完成所有测试。


正则表达式longRegex,用于检测号码以1开头是否符合规则。在号码以1开头且符合规则的情况下,应该显示true,比如1 555-555-5555。

测试数字为1 555-555-5555,该数字符合电话号码结构规则。

1.在测试数字为1 555-555-5555的情况下,函数正确判定。longRegex正则判定结果应该为true,但是为什么longRegex会显示为false?和函数结果相反?我并没有使用任何取反运算符,实在找不到原因。

单独测试结果也显示为true。

2.将函数改动一下,将下面两个console.log语句搬运到上面,其他没有任何改动。同样的数字,1 555-555-5555,结果就和正确结果相反了,显示为false。

console.log方法应该并没有更改任何变量的值,为什么只是将其移动到上面,就导致函数出错?

到目前为止你的代码

<!-- file: index.html -->
<DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="styles.css"/>
    <title>Telephone Number Validator</title>
  </head>
  <body>
    <main>
      <figure>
        <img src="https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg" alt="logo"/>
      </figure>
      <p id="title">Telephone Number<br/>Validator</p>
      <div  id="container">
        <div id="mark"></div>
        <div id="background">
          <label for="user-input">Enter a Phone Number:</label>
          <input type="text" id="user-input"/>
          <p id="results-div"></p>
        </div>
        <button id="check-btn">Check</button>
        <button id="clear-btn">Clear</button>
      </div>
    </main>
    <script src="script.js"></script>
  </body>
</html>
/* file: script.js */
const userInput = document.querySelector('#user-input');
const checkBtn = document.querySelector('#check-btn');
const clearBtn = document.querySelector('#clear-btn');
const results = document.querySelector('#results-div');
/*
if str源字符没有任何输入
  显示"Please provide a phone number"
else if str有输入,没有非数字/括号/空格符号,即为有效输入

  去掉空格和括号的字符为proStr,检查长度
  if proStr字符长度=10
  str必须是正则/^\d{9}\d$|^\d{3}-\d{3}-\d{4}$|^\(\d{3}\)\d{3}-\d{4}$/g
  return true,显示"Valid US number:"
  设置开头结尾显示,是避免有重复的空格和括号
  else if proStr字符长度=11 && 首位字符是1
  str必须是正则/^1\s\d{3}-\d{3}-\d{4}$|^1\s\(\d{3}\)\s\d{3}-\d{4}$|^1\(\d{3}\)\d{3}-\d{4}$|^1\s(\d{3})\s\d{3} \d{4}$/g
  return true,显示"Valid US number:"
  else 有效输入但长度和格式不对
  return false,显示"Invalid US number:"

else 存在非数字/括号/空格符号,无效输入
  return false,显示"Invalid US number:"
*/

//去掉空格,括号,减号,只保留纯数字
const processStr = (str)  => {
  const regex = /[\s\(\)-]/g;
  const proStr = str.replace(regex,'');
  console.log(`proStr: ${proStr}`);
  return proStr;
};

const chekcStr = (proStr, str) => {
  //proStr只有数字用来检查长度,str源字符
  const checkRegex = /[^\d\s-\(\)]/g;
  const shortRegex = /^\d{9}\d$|^\d{3}-\d{3}-\d{4}$|^\(\d{3}\)\d{3}-\d{4}$/g;
  const longRegex = /^1\s\d{3}-\d{3}-\d{4}$|^1\s\(\d{3}\)\s\d{3}-\d{4}$|^1\(\d{3}\)\d{3}-\d{4}$|^1\s(\d{3})\s\d{3} \d{4}$/g;
  console.log(`是否是有效输入:${!checkRegex.test(str)}`);
  if (str === '') {
    console.log('');
    return '';
  } else if (!checkRegex.test(str)) {
    if (proStr.length === 10 && shortRegex.test(str) === true) {
      console.log(`shortRegex: ${shortRegex.test(str)}`);
      //return shortRegex.test(str);
      return true;
    } else if (proStr.length === 11 && str[0] === '1' && longRegex.test(str) === true) {
      console.log(`longRegex: ${longRegex.test(str)}`);
      //return longRegex.test(str);
      return true;
    }  else {
      //输入有效但是长度或者是格式不符合
      return false;
    }
  } else {
    return false;
  } 
};
const updateUI = (result, str) => {
  if (result === '') {
    alert('Please provide a phone number');
  } else if (result) {
    results.style.display = 'block';
    results.innerHTML += `Valid US number: ${str}<br/>`;
  } else {
    results.style.display = 'block';
    results.innerHTML += `Invalid US number: ${str}<br/>`;
  }
}; 

checkBtn.addEventListener('click', () => {
  const str = userInput.value;
  const proStr = processStr(str);
  const result = chekcStr(proStr,str);
  console.log(`chekcStr函数结果: ${result}`);
  updateUI(result, str);
});
clearBtn.addEventListener('click', () => {
  results.innerText = '';
  results.style.display = 'none';
  userInput.value = '';
})
/* file: styles.css */
* {
  padding: 0;
  margin: 0;
}
html {
  background-color: rgba(59, 59, 79);
  font-size: 16px;
  text-align: center;
}
figure {
  margin-top: 30px;
  margin-bottom: 40px;
}
figure img {
  width: 300px;
}
#title {
  color: white;
  font-size: 2rem;
  font-weight: bold;
  margin-bottom: 40px;
}
#container {
  background-color: rgba(0, 0, 0);
  border-radius: 10px;
  width: 270px;
  padding: 10px 10px 15px 10px;
  margin: 0 auto;
}
#container #mark {
  width: 100%;
  height: 35px;
}
#background {
  width: 220px;
  height: 360px;
  background-color: rgba(223, 223, 226);
  padding: 10px 10px 0 10px;
  margin: 0 auto;
  margin-bottom: 5px;
}
#container label {
  display: block;
  margin-bottom: 15px;
}
#user-input {
  display: block;
  width: 100%;
  height: 35px;
  border: 1px solid black;
  border-radius: 5px;
  margin-bottom: 20px;
}
#results-div {
  color: rgba(77, 56, 0);
  font-size: 1.3rem;
}
button {
  width: 100px;
  height: 30px;
  background: linear-gradient(180deg,rgb(251, 250, 250), rgb(198, 195, 192), rgb(148, 144, 137));
  color: black;
  font-size: 1.1rem;
  border-left: 4px solod rgb(255, 255, 255);
  border-top: 4px solod rgb(255, 255, 255);
  border-right: 4px solod rgb(170, 170, 170);
  border-bottom: 4px solod rgb(170, 170, 170);
}
#check-btn {
  margin-right: 20px;
}

你的浏览器信息:

用户代理是: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0

挑战信息:

创建电话号码验证项目 - Build a Telephone Number Validator

我去,刚才发现,用字符串长度+正则直接判断更简单,没必要做中间的转换