You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:57:50