JavaScript中调用monthDateMapper('Apr')为何无法赋值为'04'?
问题出在循环的执行逻辑上!
嘿,我一眼就发现问题所在了——你的for...in循环会遍历months对象的每一个属性,每一轮循环都会执行那个三元判断。举个例子,当循环到'Apr'的时候,确实会把monthDate设为'04',但循环可不会停下来!它还会继续遍历后面的'May'、'Jun'……直到最后一个属性。而这些后续的循环里,month === monthAbrev显然不成立,所以monthDate会被一次次重新赋值为'Invalid Value'。等循环结束时,最后一次的赋值覆盖了之前的正确结果,这就是为什么你调用monthDateMapper('Apr')永远拿不到'04'。
而且你提到的“同类型同值字符串匹配不为true”在这里根本不是问题——month和monthAbrev都是字符串,值相同的话===肯定会返回true,锅全在循环逻辑上。
两种修复方案供你选
方案1:直接访问对象属性(最推荐,简洁又高效)
其实完全没必要用循环来做这件事,对象本身就是键值对映射,直接通过键访问就好:
monthDateMapper(month) { const months = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'July': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec':'12' }; // 存在对应键就返回值,否则返回默认的无效值 return months[month] || 'Invalid Value'; }
这里利用了JS的逻辑或特性:如果months[month]是存在的有效值(非undefined、非空等),就返回它;否则就返回后面的'Invalid Value'。
方案2:修复循环逻辑(如果一定要保留循环写法)
要是你坚持想用循环,那必须在找到匹配项后立刻终止循环,避免后续赋值覆盖正确结果:
monthDateMapper(month) { const months = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'July': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec':'12' }; let monthDate = 'Invalid Value'; // 先设默认值 for(var monthAbrev in months) { if (month === monthAbrev) { monthDate = months[monthAbrev]; break; // 找到匹配项就跳出循环,别再继续了! } } return monthDate; }
这次我们先把monthDate初始化为无效值,只有找到匹配的键时才修改它,然后用break终止循环,这样后面的属性就不会再遍历,自然不会覆盖正确值了。
内容的提问来源于stack exchange,提问作者Owen Carter
相关产品推荐
相关产品推荐

