You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中mark.calcBMI比较失效,mark.bmi却正常?

问题原因分析

你遇到的核心问题是混淆了「方法本身」和「方法调用的结果」:

  1. 当你写mark.calcBMI时,拿到的是这个方法对应的函数对象本身,不是它计算出来的BMI数值。JavaScript里函数是独立的对象,直接比较两个函数对象时,实际是在比较它们的内存地址——这两个函数是单独定义的,地址必然不同,所以mark.calcBMI > john.calcBMI的判断结果永远为false,自然会走else分支。

  2. 而mark.calcBMI()带了括号,这才是调用这个方法,会执行里面的计算逻辑并返回BMI数值,所以console.log(mark.calcBMI())能输出正确结果。如果要通过方法比较大小,你需要写成:

    if (mark.calcBMI() > john.calcBMI()) {
      // 你的业务逻辑
    }
    
  3. 至于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:00:04