为何JavaScript中mark.calcBMI比较失效,mark.bmi却正常?
问题原因分析
你遇到的核心问题是混淆了「方法本身」和「方法调用的结果」:
当你写
mark.calcBMI时,拿到的是这个方法对应的函数对象本身,不是它计算出来的BMI数值。JavaScript里函数是独立的对象,直接比较两个函数对象时,实际是在比较它们的内存地址——这两个函数是单独定义的,地址必然不同,所以mark.calcBMI > john.calcBMI的判断结果永远为false,自然会走else分支。而
mark.calcBMI()带了括号,这才是调用这个方法,会执行里面的计算逻辑并返回BMI数值,所以console.log(mark.calcBMI())能输出正确结果。如果要通过方法比较大小,你需要写成:if (mark.calcBMI() > john.calcBMI()) { // 你的业务逻辑 }至于
mark.bmi > john.bmi能正确工作,是因为你的calcBMI方法里应该做了这样的操作:计算完BMI后,把结果赋值给了对象的bmi属性(比如this.bmi = 计算结果)。这时候mark.bmi直接存储的是数值,自然能正常比较。
举个和你场景匹配的代码示例:
// 模拟你的对象定义 const mark = { weight: 78, height: 1.69, calcBMI: function() { this.bmi = this.weight / (this.height ** 2); return this.bmi; } }; const john = { weight: 92, height: 1.95, calcBMI: function() { this.bmi = this.weight / (this.height ** 2); return this.bmi; } }; // 错误:比较函数对象,永远走else if (mark.calcBMI > john.calcBMI) { console.log("Mark的BMI更高"); } else { console.log("John的BMI更高"); // 总会执行这里 } // 正确:调用方法获取结果再比较 if (mark.calcBMI() > john.calcBMI()) { console.log("Mark的BMI更高"); } else { console.log("John的BMI更高"); } // 正确:先调用方法生成bmi属性,再比较属性值 mark.calcBMI(); john.calcBMI(); if (mark.bmi > john.bmi) { console.log("Mark的BMI更高"); } else { console.log("John的BMI更高"); }
内容的提问来源于stack exchange,提问作者Dlastman
相关产品推荐
相关产品推荐

