如何调用对象键返回方法而非字符串,解决动态技能扣血NaN问题
解决对象属性动态访问的两个问题
直接来拆解你的问题,一步步修正代码、解决问题:
问题1:调用对象的键返回对应值(而非字符串)
首先要明确:对象的键本身是字符串,但你要的是键对应的值(不管是数值还是方法)。比如你的skills对象里,'Tackle'是键,5是它关联的值。如果想获取值,不能直接取键名字符串,而是要通过键名去访问对象的属性。
举个例子,如果你想拿到skills里第一个技能的值:
// 先获取所有技能键名的数组 const skillNames = Object.keys(userBattlePokemon[0].skills); // skillNames 结果是 ['Tackle', 'LeechSeed'] // 通过键名获取对应的值 const firstSkillValue = userBattlePokemon[0].skills[skillNames[0]]; // firstSkillValue 就是 5,如果是方法的话会返回函数本身
问题2:用变量skillName动态访问技能,修复NaN错误
你的代码出现NaN的核心问题有两个:
userBattlePokemon[0].skills[0]是错误写法——skills是对象,不是数组,不能用索引[0]访问,这会得到undefined- 后续的
userBattlePokemon[0].skills[0].skillName错上加错,undefined上访问属性只会得到undefined,数值减undefined自然变成NaN
下面是正确的实现方式:
第一步:正确获取技能名称变量
如果你想动态获取第一个技能的名称:
let skillName = Object.keys(userBattlePokemon[0].skills)[0]; // 此时 skillName 是字符串 'Tackle'
如果已经明确要使用某个技能,直接赋值就行:
let skillName = 'Tackle';
第二步:用方括号语法动态访问技能值
JavaScript里,当你要用变量作为对象的键时,必须用方括号语法(不能用点语法),这样才能让变量解析成对应的键名:
// 正确计算敌人生命值 enemyBattlePokemon[0].health = enemyBattlePokemon[0].health - userBattlePokemon[0].skills[skillName]; // 或者用更简洁的 -= 写法: // enemyBattlePokemon[0].health -= userBattlePokemon[0].skills[skillName];
完整修正后的代码
const userBattlePokemon = [{ skills: { Tackle: 5, LeechSeed: 10 } }]; const enemyBattlePokemon = [{ health: 100 }]; // 动态获取第一个技能名称 let skillName = Object.keys(userBattlePokemon[0].skills)[0]; // 正确计算敌人剩余生命值 enemyBattlePokemon[0].health -= userBattlePokemon[0].skills[skillName]; console.log(enemyBattlePokemon[0].health); // 输出 95,完美解决NaN问题
额外提示
- 点语法(
obj.key)只能用于固定的键名,比如userBattlePokemon[0].skills.Tackle;而方括号语法(obj[variable])支持动态变量作为键名,这正是你需要的动态适配场景。 - 如果你的
skills里存的是方法(比如技能函数),同样可以用这个方式调用:userBattlePokemon[0].skills[skillName]()就能执行对应的技能方法。
内容的提问来源于stack exchange,提问作者Wil Son
相关产品推荐
相关产品推荐

