对象中布尔值始终返回false问题及升级对象跟进咨询
requirement始终返回false的问题 咱们一步步拆解这个问题,大概率是变量作用域、初始化时机或者数据类型的问题,下面是几个核心排查方向:
1. 先确认resources.science.amount的真实状态
首先得搞清楚这个值到底是什么——直接在定义升级对象的前后加个日志输出:
console.log("当前science数量:", resources.science.amount); console.log("数据类型:", typeof resources.science.amount);
如果输出的数值小于40,那判断自然是false;如果是undefined或null,说明resources.science根本没被正确初始化;如果是字符串类型(比如"40"),虽然和数字比较大多时候没问题,但如果是无效字符串(比如"abc")会转成NaN,NaN >=40永远是false。
2. 检查requirement的求值时机(最常见的坑!)
你现在的写法是把requirement直接赋值为一个表达式的结果:
requirement: (resources.science.amount >= 40)
这意味着在对象创建的那一刻,这个表达式就会被一次性计算并把结果存在属性里。哪怕之后resources.science.amount涨到了40,requirement还是保持最初的false值。
如果需要动态判断(每次检查时都重新计算),你得把它改成一个函数:
requirement: () => (resources.science.amount >= 40)
之后检查升级条件时,要调用这个函数:if (upgrade.requirement()),而不是直接用if (upgrade.requirement)。
3. 确认resources变量的作用域
如果resources是某个函数内部的局部变量,而你的升级对象定义在这个函数外面,那resources在对象初始化时是不可访问的,resources.science.amount会变成undefined,导致判断为false。
要确保在定义升级对象的作用域里,resources是全局变量或者能被正确引用的上层作用域变量。
4. 验证resources.science是否存在
如果resources本身是undefined,或者resources.science没有被初始化(比如是null),那resources.science.amount在非严格模式下会返回undefined,同样导致undefined >=40为false。可以加日志确认:
console.log("resources对象:", resources); console.log("resources.science:", resources?.science);
快速测试方案
把requirement临时改成一个带日志的函数,快速定位问题:
requirement: () => { console.log("检查条件时的science数量:", resources.science.amount); return resources.science.amount >= 40; }
然后在需要判断升级条件的地方调用这个函数,看日志里的数值就一目了然了。
内容的提问来源于stack exchange,提问作者bejewelled

