JS条件语句挑战问题求助:西班牙、墨西哥场景测试不通过但法国场景正常
嘿,我一眼就发现你代码里的两个关键问题,这就是为什么西班牙、墨西哥的测试全部失败,但法国场景能正常通过的原因:
第一个错误:逻辑或的写法完全不符合预期
你写的country === 'Spain' || 'Mexico'并不是判断「country是Spain或者Mexico」。在JavaScript里,||运算符会先计算左边的表达式country === 'Spain',然后右边的'Mexico'是一个非空字符串,属于真值,所以整个表达式永远为真!正确的写法应该是分别对每个国家做相等判断:country === 'Spain' || country === 'Mexico'。第二个更致命的问题:两个独立的if块会覆盖变量值
你先写了处理西班牙、墨西哥的if-else逻辑,紧接着又写了一个处理法国的if-else块。举个例子:当country是Spain且时间为早上时,第一个if块确实把greeting设为'buenos dias',但第二个if块执行时,因为country不是France,会进入else分支直接把greeting改成null!这就是测试里显示「expected null to equal 'buenos dias'」的根本原因。法国场景能过,是因为当country是France时,第二个if块会覆盖第一个if块的null结果,刚好符合预期,但其他国家的结果就被意外覆盖了。
修正后的代码示例
我们可以把所有逻辑整合到一个判断链里,先判断时间有效性,再处理国家分支,避免变量被意外覆盖:
function sayHello(country, time) { let greeting = null; // 默认值设为null,符合题目“其他情况返回null”的要求 // 先判断时间是否在有效范围内 if (time >= 0 && time < 24) { // 时间有效时,再根据国家判断问候语 if (country === 'Spain' || country === 'Mexico') { greeting = time < 12 ? 'buenos dias' : 'buenas noches'; } else if (country === 'France') { greeting = time < 12 ? 'bon matin' : 'bon soir'; } // 其他国家保持默认的null即可 } // 时间无效时,同样保持默认的null return greeting; }
修正思路说明
- 先统一处理时间有效性,避免重复编写相同的时间判断逻辑
- 用三元运算符简化早晚时段的判断,让代码更简洁易读
- 把所有逻辑整合到一个分支链中,彻底避免后续代码覆盖之前变量值的问题
- 默认将
greeting设为null,完美契合题目中「其他情况都返回null」的要求
以后写多条件判断时,要注意逻辑运算符的优先级,还要警惕多个独立if块的执行顺序会不会干扰变量值,尽量把相关逻辑整合到一个判断链里哦~
备注:内容来源于stack exchange,提问作者James

