Node.js Discord Bot(discord.js)报错TypeError: Math.floor() is not a function求助
搞定TypeError: Math.floor(...) is not a function这个坑
你的伤害计算逻辑本身没毛病,但这个错误的根源绝对是Math.floor这个原生函数被你的代码其他地方意外覆盖成非函数类型了,我来给你拆解解决:
为啥会出这个错?
你贴的代码片段里没动过Math.floor,但在机器人的其他代码里,大概率有类似这种坑人的误操作:
// 错误示例1:把Math.floor直接赋值成了数字 Math.floor = 100; // 错误示例2:不小心执行了函数并把结果赋值回去 Math.floor = Math.floor(12.3);
一旦Math.floor被改成了数字、字符串这类非函数值,再调用它就会抛出“不是函数”的错误。
怎么排查修复?
- 全局搜
Math.floor =
打开你的项目代码,全局搜索这个关键词,找到所有修改Math.floor的地方,直接删掉错误的赋值语句就行——毕竟没人会没事改原生Math方法对吧? - 检查变量名冲突
偶尔也会出现定义了全局变量floor,不小心污染了Math对象的情况(虽然概率低),可以搜下代码里有没有var floor或者let floor的全局定义,看看是不是和Math.floor冲突了。 - 临时应急验证
如果一时找不到哪里改了Math.floor,可以在你的伤害计算函数里先强制用原生方法,验证是不是这个问题:
这样如果错误消失了,就坐实是Math.floor被覆盖的问题。// 先把原生floor存起来,避免被覆盖影响 const nativeFloor = Math.floor.bind(Math); var damage = nativeFloor( Math.random() * skill.dmg/5 ) + skill.dmg; damage = nativeFloor(damage);
顺便优化下你的伤害计算代码
其实你代码里的parseFloat完全多余,因为Math.floor返回的是整数,加上skill.dmg(应该也是数字)结果还是数字,没必要转浮点数。可以简化成:
// 直接计算基础伤害,结果已经是整数的话连最后一步floor都省了 const damage = skill.dmg + Math.floor(Math.random() * (skill.dmg / 5));
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

