如何在JavaScript构造函数中使用数组并计算学生成绩平均值
解决JavaScript学生对象构造函数的成绩数组与平均值计算问题
嘿,我来帮你搞定这个问题!你之前的代码里有个核心小疏漏——把this.grades直接赋值成了空数组[],这就完全忽略了传入的grades参数啦~下面给你两种靠谱的实现方式,涵盖传统构造函数和现代ES6类写法:
方法一:传统构造函数写法
function Student(name, surname, number, grades) { // 绑定基本属性 this.name = name; this.surname = surname; this.number = number; // 处理成绩数组:优先用传入的数组,容错处理非数组输入 this.grades = Array.isArray(grades) ? [...grades] : []; // 定义计算平均值的方法 this.getAverage = function() { // 没有成绩时返回0,避免除以0报错 if (this.grades.length === 0) return 0; // 用reduce快速求和 const totalScore = this.grades.reduce((sum, grade) => sum + grade, 0); // 返回平均值,可根据需求保留小数 return totalScore / this.grades.length; }; }
关键细节说明:
- 用
Array.isArray(grades)做容错判断:如果传入的不是数组(比如误传了单个数字或字符串),就用空数组兜底,避免后续计算报错。 - 用
[...grades]创建数组副本:这样外部修改原始传入的数组时,不会影响实例内部的成绩数据,保证数据独立性。
方法二:ES6类写法(更简洁易读)
现在很多项目都用ES6类来写面向对象代码,逻辑更清晰:
class Student { constructor(name, surname, number, grades) { this.name = name; this.surname = surname; this.number = number; // 同样做数组容错和拷贝 this.grades = Array.isArray(grades) ? [...grades] : []; } // 把计算平均值的方法定义在类的原型上(更节省内存) getAverage() { if (this.grades.length === 0) return 0; const totalScore = this.grades.reduce((sum, grade) => sum + grade, 0); return totalScore / this.grades.length; } }
使用示例
不管用哪种写法,使用方式都一样:
// 创建学生实例 const alice = new Student("Alice", "Smith", "S456", [90, 88, 95, 82]); // 访问属性 console.log(alice.name); // 输出:Alice console.log(alice.grades); // 输出:[90, 88, 95, 82] // 计算平均值 console.log(alice.getAverage()); // 输出:88.75
这样就能完美实现你想要的功能啦——正确接收成绩数组,并且能计算平均值~
内容的提问来源于stack exchange,提问作者Hoppi
相关产品推荐
相关产品推荐

