You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript求平方根函数故障:非数字输入无法触发NaN提示与重新输入

修复你的平方根函数的NaN处理逻辑

我来帮你揪出代码里的问题并搞定它!你的核心功能没问题,但几个小细节导致NaN处理完全失效了:

问题拆解

  • 多余分号毁了条件判断:第二个if (!isNaN(userNum));后面的分号,让这个if直接变成了空操作——后面的{ alert(Math.sqrt(userNum)) }会无条件执行,哪怕用户输入的是非数字,这部分代码照样跑,自然看不到你想要的重试逻辑。
  • 重试调用完全错误:检测到NaN时,你写了prompt(userNum),这里的参数是NaN(因为此时userNum就是NaN),不仅提示文案莫名其妙,而且新输入的值根本没存到userNum里,也没重新校验,等于白弹了个输入框。
  • 错误提示不友好:alert(NaN)会弹出"NaN",普通用户哪懂这是什么意思,换成直白的提示文字才合理。

修复后的代码

给你两种靠谱的修复方案,选哪种都行:

方案1:用循环持续请求有效输入

function sqrtUserNum() { 
  let userNum;
  // 循环直到拿到有效数字
  do {
    userNum = parseFloat(prompt("Give me a number and I'll tell you its square-root."));
    if (isNaN(userNum)) {
      alert("请输入有效的数字!");
    }
  } while (isNaN(userNum));

  // 确认有效后弹出平方根
  alert(Math.sqrt(userNum));
} 
sqrtUserNum();

方案2:用递归调用实现重试

function sqrtUserNum() { 
  let userNum = parseFloat(prompt("Give me a number and I'll tell you its square-root.")); 
  
  if (isNaN(userNum)) { 
    alert("请输入有效的数字!");
    // 递归调用自身,重新发起输入请求
    return sqrtUserNum();
  } 

  // 拿到有效数字后计算并弹出平方根
  alert(Math.sqrt(userNum));
} 
sqrtUserNum();

核心改进点

  • 删掉了破坏逻辑的多余分号,用循环/递归清晰区分有效和无效输入的处理分支
  • 把晦涩的alert(NaN)换成了用户能看懂的提示文字
  • 重试时会真正重新发起输入请求,并且确保只有拿到有效数字后才会执行平方根计算

内容的提问来源于stack exchange,提问作者Bryan Cable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:24:39