JS中如何对赋值字符串做if等于false判断并处理undefined返回
问题原因
- 数组下标越界是返回undefined的核心原因:你的武器名称数组总共只有16个元素,合法下标范围是0~15,但你用
Math.floor(Math.random() * 17)计算下标,最高会得到16的下标,访问不存在的数组元素自然返回undefined。 - 变量重复声明错误:你反复用
var name覆盖同一个变量,原本存储数组的name被后续取出的字符串值覆盖,后续执行name[Number.isInteger]属于用字符串访问不存在的属性,直接得到undefined。 - 条件判断逻辑错误:
if (name = false)是赋值操作不是判断操作,这个分支永远不会触发,你的重试逻辑根本不会执行。 - Number.isInteger用法错误:Number.isInteger是用来判断参数是否为整数的方法,需要传参调用,比如
Number.isInteger(3)返回true,你直接把它当属性名访问完全不符合语法规则。
修复思路
- 不要硬编码数组长度,所有随机下标计算都用
数组.length作为乘数,从根源避免下标越界。 - 不要重复声明同名变量,不同用途的变量用不同名称区分,避免覆盖。
- 用while循环实现重试逻辑:只要取出的武器名为空/undefined,就重新生成随机下标取值,直到拿到有效值为止。
- 修正条件判断的语法,用
===做全等判断,避免赋值操作符误用。
完整修复代码
// 武器库数组单独存储不覆盖 const weaponList = ["bloods edge", "grass cutter", "death bringer", "yellow harbinger", "flame cutter", "ice shooter", "Big Hurt", "gun", "big gun", "bigger gun", "biggg gun", "biggest gun", "big sword", "sword", "bigger sword", "big swords brother"]; let weaponName; // 重试逻辑:没拿到有效值就重新取 while (!weaponName) { // 直接用数组长度计算下标,永远不会越界 weaponName = weaponList[Math.floor(Math.random() * weaponList.length)]; } console.log(weaponName); console.log("Attack Damage"); const Damage = (Math.random() * 100); console.log(Math.ceil(Damage)); const goodPrefixList = ["Swings with a burst of fire!", "Inflicts Posion!", "A very sharp boy", "Shoots discs of mana", "Sometimes kills instantly", "Sometimes heals you to max health"]; const prefix = goodPrefixList[Math.floor(Math.random() * goodPrefixList.length)]; if (Damage >= 70) { console.log("PREFIX FOR BEING GOD WOW!"); console.log(prefix); } const badPrefixList = ["broken to bits", "sometimes inflicts no damage", "inflicts self damage", "why would you use this???", "seriously stop using me", "Insults you everytime you swing", "just rude"]; const badPrefix = badPrefixList[Math.floor(Math.random() * badPrefixList.length)]; if (Damage <= 30) { console.log("Prefix for being BAD"); console.log(badPrefix); }
内容的提问来源于stack exchange,提问作者Joshua Searles
相关产品推荐
相关产品推荐

