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

JavaScript初学者技术咨询:两种BMI计算代码哪种更优?求推荐更佳写法

JavaScript BMI计算代码规范对比与优化建议

嗨!咱们来仔细分析下你这两段代码的写法,看看哪种更规范优质,再聊聊更优的实现方式~

首先要指出你两种写法里的共同问题:重复调用calcBMI()函数。每次调用这个函数,不仅会重新计算BMI值,还会给对象的bmi属性赋值——虽然这里计算量很小,重复执行不会有明显性能问题,但这是个不好的编程习惯,而且完全没必要做重复劳动。

两种写法的优缺点分析

  • 第一种写法(三元运算符):
    这段代码把比较和字符串拼接挤在了一行,看似简洁但可读性极差——这么长的三元表达式,一眼扫过去很难快速理清逻辑。更关键的是,这里一共调用了4次calcBMI()(判断条件里2次,字符串模板里2次),完全是在做无用功。

  • 第二种写法(if-else):
    思路比第一种要合理:先提前调用calcBMI()把BMI值存到对象的bmi属性里,避免了判断时重复计算。但可惜的是,在console.log里又重复调用了calcBMI(),等于又多算了4次,把之前的优势完全浪费了。

更优的实现方式

咱们可以结合两种写法的优点,同时避免重复计算的问题,还能让代码更简洁规范。这里有两种推荐的写法:

写法一:清晰的分步逻辑(适合逻辑复杂的场景)

const mark = { 
  fullName: "Mark Miller", 
  mass: 78, 
  height: 1.69, 
  // 用ES6方法简写,比function写法更简洁规范
  calcBMI() { 
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }, 
}; 
const john = { 
  fullName: "John Smith", 
  mass: 92, 
  height: 1.95, 
  calcBMI() {
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }, 
};

// 只计算一次BMI,把结果存到变量(也可以直接用mark.bmi/john.bmi)
const markBMI = mark.calcBMI();
const johnBMI = john.calcBMI();

let resultMessage;
if (markBMI > johnBMI) {
  resultMessage = `${mark.fullName}'s BMI (${markBMI}) is higher than ${john.fullName}'s (${johnBMI})!`;
} else {
  resultMessage = `${john.fullName}'s BMI (${johnBMI}) is higher than ${mark.fullName}'s (${markBMI})!`;
}

console.log(resultMessage);

写法二:简洁的三元表达式(适合逻辑简单的场景)

如果判断逻辑比较简单,也可以用三元表达式,但前提是先算好BMI值,避免重复调用函数:

const mark = { 
  fullName: "Mark Miller", 
  mass: 78, 
  height: 1.69, 
  calcBMI() { 
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }, 
}; 
const john = { 
  fullName: "John Smith", 
  mass: 92, 
  height: 1.95, 
  calcBMI() {
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }, 
};

const markBMI = mark.calcBMI();
const johnBMI = john.calcBMI();

const resultMessage = markBMI > johnBMI 
  ? `${mark.fullName}'s BMI (${markBMI}) is higher than ${john.fullName}'s (${johnBMI})!`
  : `${john.fullName}'s BMI (${johnBMI}) is higher than ${mark.fullName}'s (${markBMI})!`;

console.log(resultMessage);

优化点总结

  1. 避免重复计算:只调用两次calcBMI(),把结果存起来复用,不要反复执行相同的计算逻辑
  2. 遵循ES6语法规范:用calcBMI()代替calcBMI: function(),这是现代JavaScript的标准写法,更简洁清爽
  3. 可读性优先:逻辑复杂时分步写if-else,逻辑简单时再用简洁的三元表达式,不要为了“一行代码”牺牲可读性

内容的提问来源于stack exchange,提问作者noharm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:19:08