发布时间:2023-05-23 文章分类:WEB开发, 电脑百科 投稿人:赵颖 字号: 默认 | | 超大 打印

最近在写项目的时候,有个部分是判断数组内是否存在这个日期,如果不存在的话则日期减一天或加一天再遍历一次数组内是否存在这个日期,重复此操作直到找到日期为止。

日期操作代码如下

 //日期加一天或减一天
        function moreDate(date1,i) {
            let date =new Date(date1)
            let year = date.getFullYear();
            //补全位数
            let month = (date.getMonth()+1).toString().padStart(2,'0')
            let day = (date.getDate()+i).toString().padStart(2,'0')
            return year+"-"+month+"-"+day
        }

但是会存在一个问题就是,由于这个操作是递归操作,每次找不到日期时不是跳出方法,而是再执行一次这个方法,当重复多次这个递归操作时就会导致达到调用堆栈限制,就会有Maximum call stack size exceeded错误,这个错误的意思是 "超出最大调用堆栈大小"。

Maximum call stack size exceeded错误

发生这种错误大多都是语句判断没有写对,或者忘了写判断语句导致递归操作无限重复下去。

这里建议是在谷歌浏览器中f12对js文件中报错的位置打断点,一步步看究竟是哪的条件语句出错了。

在这里日期到10月01日的时候,进行日期减一操作时,日变成00了

Maximum call stack size exceeded错误

再下一步操作时,日期2022-10-00就是一个错误日期了,然后就导致递归操作的判断条件一直错误,导致无限递归出现Maximum call stack size exceeded错误

Maximum call stack size exceeded错误

 所以我们在这对日期加减方法进行改良,先对日期进行操作再获取年月日的数据。

       //日期加一天或减一天
        function moreDate(date1,i) {
            let date =new Date(date1)
             date.setDate(date.getDate()+i) //先对日期进行加减操作再将日期set回去
            let year = date.getFullYear();
            //补全位数
            let month = (date.getMonth() + 1).toString().padStart(2, '0')
            let day = (date.getDate()).toString().padStart(2, '0')
            return year+"-"+month+"-"+day
        }

再执行方法,10月01日减一天就变成了9月30日了,接着顺利执行递归操作。

Maximum call stack size exceeded错误