JavaScript "Not-A-Number"错误:计算函数返回值异常排查
prodde_kris函数返回NaN而不是数字? 首先得明确:JavaScript里的NaN(非数字)只会在数学运算中混入了非有效数字时才会出现。虽然Atom编辑器的静态分析认为函数会返回数字,但浏览器运行时实际用到的变量可能不符合预期,导致计算失败。
我帮你拆解几个最可能的原因,以及对应的排查和解决方法:
一、排查变量是否存在/有效
你的函数用到了4个外部变量(bonus、stufe_Plasma_1、speed)和1个参数(Stufe_Kris),只要其中任何一个是undefined、null、非数字字符串或者其他不能参与数学运算的值,整个表达式就会返回NaN。
快速排查方法
在函数开头加几行日志,把所有变量的类型和值打印出来,然后在Chrome开发者工具(按F12打开)的Console面板查看:
function prodde_kris(Stufe_Kris){ // 打印所有用到的变量,看哪个出问题 console.log("参数Stufe_Kris的值/类型:", Stufe_Kris, typeof Stufe_Kris); console.log("外部变量bonus的值/类型:", bonus, typeof bonus); console.log("外部变量stufe_Plasma_1的值/类型:", stufe_Plasma_1, typeof stufe_Plasma_1); console.log("外部变量speed的值/类型:", speed, typeof speed); var prodde = (20 * Math.pow(1.1, Stufe_Kris) * Stufe_Kris * bonus * ((100 + 0.66 * stufe_Plasma_1)/100) + 15)* speed; return prodde; };
比如如果看到bonus的类型是undefined,那就是这个变量没定义,直接导致计算失败。
二、针对性解决方法
根据排查结果,你可以做这些处理:
确保参数是数字
调用函数时别传非数字值,比如prodde_kris(5)而不是prodde_kris("5")或者不传参数。如果没法保证调用时的参数类型,就在函数里强制转换:// 把参数转成数字,转换失败的话默认用0 const stufeKrisNum = Number(Stufe_Kris) || 0;处理外部变量的缺失/非数字情况
对于bonus、stufe_Plasma_1、speed这些外部变量,要么确保它们在全局作用域里已经被正确定义为数字,要么在函数里做兜底处理:// 给每个变量加默认值,避免undefined导致NaN const bonusNum = typeof bonus === 'number' ? bonus : 1; // 假设bonus默认是1 const stufePlasma1Num = typeof stufe_Plasma_1 === 'number' ? stufe_Plasma_1 : 0; const speedNum = typeof speed === 'number' ? speed : 1; // 假设speed默认是1重构函数避免依赖外部变量(推荐)
依赖全局变量很容易出这种问题,最好把bonus、stufe_Plasma_1、speed也作为参数传入函数,这样更可控:function prodde_kris(Stufe_Kris, bonus, stufe_Plasma_1, speed){ // 先统一转换为数字并兜底 const stufeKris = Number(Stufe_Kris) || 0; const bonusVal = Number(bonus) || 1; const plasmaVal = Number(stufe_Plasma_1) || 0; const speedVal = Number(speed) || 1; var prodde = (20 * Math.pow(1.1, stufeKris) * stufeKris * bonusVal * ((100 + 0.66 * plasmaVal)/100) + 15)* speedVal; return prodde; }; // 调用时传全参数:prodde_kris(3, 2, 5, 1.5)
三、验证修复效果
修改后,你可以在Chrome控制台直接调用函数,比如prodde_kris(2, 1, 3, 1),看看返回的是不是数字。如果还是NaN,再回去看日志,肯定还有某个变量没处理好。
内容的提问来源于stack exchange,提问作者8Bit

