JS实现Taximeter计价器函数运行返回NaN问题排查
NaN问题排查与修复
代码输出NaN是多个逻辑、语法问题共同导致的,具体问题点和修复方式如下:
核心问题清单
- 输入类型错误:
prompt()返回值为字符串类型,直接参与数值计算会触发隐式类型转换异常 - 作用域冲突:
km > 7分支内用let声明的routePrice是块级作用域,仅在当前分支内可访问;而km <=7分支内用var声明的同名变量是函数作用域,当执行km>7分支时该变量不会被赋值,后续计算取到undefined转数值即为NaN - 语法逻辑错误:JavaScript不支持
8 >= persons >= 5这类连续比较写法,运算时会先得到左侧布尔值再和右侧数字比较,结果完全不符合预期;同时人数判断分支写反了区间判断逻辑,漏了1-4人的正常分支覆盖 - 拼写错误:0-4人分支内变量名写为
personExpenses(少了末尾的s),和其他分支的personsExpenses不一致,触发未定义变量错误 - 不合理的原地赋值:计算时用
-=*=+=直接修改原始输入变量和中间变量,容易引发值污染
修复后完整代码
function Taximeter() { // 基础起步价 const baseFare = 3.9; // 输入转数值,避免字符串计算问题 const km = Number(prompt("How far is your target")); // 提前声明所有公共变量,设置默认值避免undefined let routePrice = 0; let distanceFare = 0; let personsExpenses = 0; // 修正里程费用计算逻辑 if (km <= 7) { routePrice = 2.3; distanceFare = km * routePrice; } else { routePrice = 1.65; const overLength = km - 7; const overFare = overLength * routePrice; const within7Fare = 7 * 2.3; distanceFare = within7Fare + overFare; } const persons = Number(prompt("How much persons are driving with you?")); if (persons > 8) { console.log("Only 8 persons can drive with you."); return; // 超载直接终止计算 } else if (persons >=5 && persons <=8) { // 修正连续比较为逻辑与连接 personsExpenses = 5; } else if (persons >=1 && persons <=4) { // 修正写反的区间判断 personsExpenses = 0; } else { console.log("Please input valid person count"); return; } const wholeExpenses = baseFare + distanceFare + personsExpenses; console.log(wholeExpenses); } // 调用函数测试 Taximeter();
编码规范提示
- 所有用户输入先做类型转换,是前端弹窗/表单输入计算的基本要求
- 涉及跨分支使用的变量,统一在最靠近使用场景的上层作用域声明,不要在不同分支内重复声明同名变量
- 不要滥用原地赋值运算符,普通计算直接用
+-*即可,避免意外修改原始值引发排查困难
内容的提问来源于stack exchange,提问作者Özgür Sahin
相关产品推荐
相关产品推荐

