为何JavaScript中myTodos.meetDone()函数返回NaN?
问题分析与修复方案
嘿,我来帮你捋捋这个导致meetDone()返回NaN的问题,顺便把代码里的其他小问题也一起修正了~
核心问题:属性与函数名重复定义
你在myTodos对象里先声明了meetDone: 0这个数值属性,后面又把meetDone重新定义成了函数。在JavaScript对象中,后定义的属性会直接覆盖前面的,所以当你在meetDone函数里执行this.meetDone = this.meetDone - num时,这里的this.meetDone一开始指向的是函数本身,函数和数字做减法运算自然会得到NaN。
次要问题:report函数语法与逻辑错误
你的report函数里模板字符串没写完(缺少闭合反引号和完整变量),而且计算剩余会议的逻辑也不对——剩余会议应该是总会议数减去已完成的,不是相加。
修正后的完整代码
let myTodos = { day: 'Monday', meetings: 0, meetDone: 0, addMeeting: function (num) { this.meetings = this.meetings + num; }, // 把函数名改成completeMeeting,避免和属性名冲突 completeMeeting: function (num) { this.meetDone = this.meetDone + num; // 完成会议应该累加数量,原代码的减法逻辑不符合常理 }, resetDay: function () { this.meetings = 0; this.meetDone = 0; }, report: function () { let meetLeft = this.meetings - this.meetDone; // 修正剩余会议计算逻辑 return `You have ${meetLeft} meetings left today!`; } }; // 测试示例 myTodos.addMeeting(5); myTodos.completeMeeting(2); console.log(myTodos.report()); // 输出:You have 3 meetings left today! console.log(myTodos.meetDone); // 输出:2,不再是NaN
额外说明
如果你的原意是用meetDone函数来减少待完成会议数(比如取消会议),那可以把函数逻辑改成this.meetings = this.meetings - num,但无论如何,都要避免属性名和函数名重复,这是导致NaN的根本原因。
内容的提问来源于stack exchange,提问作者Amir Meimari
相关产品推荐
相关产品推荐

