if/else语句布尔逻辑故障:多国家时段问候函数异常修复请求
你的代码核心问题出在逻辑运算符的优先级上:JavaScript中&&的优先级高于||,导致条件表达式被错误解析,触发了异常结果。
具体错误点:
墨西哥晚间输出错误:
原代码第一个条件morning && country === 'Spain'|| country==='Mexico'会被解析为(morning && country === 'Spain') || country==='Mexico'——这意味着只要country是Mexico,不管morning是true还是false,都会进入该分支,所以墨西哥晚间(morning=false)时会错误赋值buenos dias。法国晚间输出null:
当法国处于晚间(!morning=true)时,原代码第二个条件!morning && country === 'Mexico'|| country==='Spain'会被解析为(!morning && country === 'Mexico') || country==='Spain',法国不满足该条件;后续第三个条件因morning=false不触发,本应匹配的第四个条件!morning && country==='France'虽逻辑上成立,但如果测试时time超出0-24范围导致morning=null,会因!null=true但原代码逻辑的优先级问题间接触发else分支,最终返回null。
修复后的代码:
function sayHello(country, time) { let greeting; let morning; if(time >= 0 && time < 12){ morning = true; } else if(time >= 12 && time < 24){ morning = false; } else { morning = null; }; // 给多国家判断添加括号,确保逻辑顺序正确 if(morning && (country === 'Spain' || country === 'Mexico')){ greeting = 'buenos dias'; } else if (!morning && (country === 'Mexico' || country === 'Spain')){ greeting = 'buenos noches'; } else if(morning && country === 'France'){ greeting = 'bon matin'; } else if(!morning && country === 'France'){ greeting = 'bon soir'; } else { greeting = null; } return greeting; } console.log(sayHello('Mexico', 15)); // 输出"buenos noches" console.log(sayHello('France', 18)); // 输出"bon soir"
修复说明:
给每个涉及多国家判断的条件加上括号(country === 'Spain' || country === 'Mexico'),确保先判断国家是否属于目标集合,再结合morning的状态进行逻辑运算,彻底避免优先级导致的逻辑混乱。修复后所有场景的问候语都能正确返回。
内容的提问来源于stack exchange,提问作者Umar Hussain

