JavaScript日期假期判断函数返回值异常问题排查
问题:日期假期判断函数未正确返回结果
我编写了一段JavaScript代码用于判断日期是否属于假期:定义假期对象ferien,通过getFerien2函数遍历假期,判断传入日期是否在假期区间内。当传入假期日期(如2023-05-31)时,函数内部if语句触发并打印“Holiday!”,但函数未返回true,导致外部判断输出“Working Day”,而非预期的“Holiday”。已确认内部if条件为true,不清楚问题所在。
代码如下:
//list of holidays const ferien = { //Sommerferien: ["2022-07-25", "2022-09-02"], //Herbstferien: ["2022-10-17", "2022-10-31"], //Weihnachtsferien: ["2022-12-23", "2023-01-02"], //Osterferien: ["2023-04-03", "2023-04-06"], Pfingsferien: ["2023-05-30", "2023-06-07"], }; //function to check, weather a date is in holiday or not const getFerien2 = (date) => { //should run through all keys from ferien-Object Object.keys(ferien).forEach((element) => { //Test if timestamp of date lies between starting- and enddate of holiday "Pfingsferien" if ( Date.parse(ferien[element][0]) <= Date.parse(date) && Date.parse(date) <= Date.parse(ferien[element][1]) ) { console.log("Holiday!"); return true; } else { return false; } }); }; //Test for a specific date if (getFerien2("2023-05-31") === true) { console.log("Holiday"); } else { console.log("Working Day"); }
预期输出:
Holiday! Holiday
实际输出:
Holiday! Working Day
问题原因
核心问题出在forEach回调函数的return行为上:
forEach的回调是独立函数,回调里的return只会终止当前回调的执行,不会让外层的getFerien2函数返回任何值。- 因此
getFerien2函数默认返回undefined,外部判断undefined === true不成立,最终输出“Working Day”。
解决方案
可以用以下两种方式修改代码,让函数正确返回判断结果:
方案1:使用some方法遍历
some方法会在找到第一个满足条件的元素时立即返回true,遍历完所有元素都不满足则返回false,正好匹配需求:
const getFerien2 = (date) => { const targetDate = Date.parse(date); // 使用some遍历,找到符合条件的假期就返回true return Object.keys(ferien).some((element) => { const start = Date.parse(ferien[element][0]); const end = Date.parse(ferien[element][1]); if (start <= targetDate && targetDate <= end) { console.log("Holiday!"); return true; } return false; }); };
方案2:使用for...of循环手动遍历
for...of循环是普通的循环结构,里面的return会直接终止外层函数并返回值:
const getFerien2 = (date) => { const targetDate = Date.parse(date); for (const element of Object.keys(ferien)) { const start = Date.parse(ferien[element][0]); const end = Date.parse(ferien[element][1]); if (start <= targetDate && targetDate <= end) { console.log("Holiday!"); return true; } } // 所有假期都不匹配时返回false return false; };
修改后调用getFerien2("2023-05-31")会返回true,外部判断将输出“Holiday”,符合预期。
内容的提问来源于stack exchange,提问作者nebuto
相关产品推荐
相关产品推荐

