如何解决含条件判断的循环方法中的Long溢出错误?
问题分析与解决建议
错误根源
你遇到的long overflow错误,是因为处理number字段的字符串值"567553218"时调用了Date.parse()。部分JS引擎会将这个纯数字字符串判定为无效日期并返回NaN,但GraalVM的JS引擎会尝试将其解析为日期相关数值,最终计算出的时间戳超出了Java 64位有符号long的范围,导致溢出异常。
同时原函数的逻辑存在漏洞:if (isNaN(actualDate) || !(isNaN(actual[key])))的判断逻辑没有正确处理非日期字段,既没有对比actual和expected的字段值,也没有正确设置checkForMatch的结果。
解决步骤与优化代码
核心修复思路
- 精准定位日期字段:只对明确是日期类型的字段(比如
hitDate)执行日期解析和校验,避免对非日期字段调用Date.parse。 - 前置日期格式校验:用正则先验证日期字符串格式,减少无效解析操作。
- 修复匹配逻辑:非日期字段直接对比值,确保
checkForMatch结果准确。
修改后的代码
var actual = { "nameTag": "abc123", "number": "567553218", "hitDate": "2022-12-09" }; var expected = { "nameTag": "abc123", "number": "567553218", "hitDate": "2022-12-09" }; // 指定需要处理日期的字段 const DATE_FIELDS = ['hitDate']; // 校验YYYY-MM-DD格式的正则 const DATE_FORMAT_REGEX = /^\d{4}-\d{2}-\d{2}$/; function matchVar(actual, expected) { const matchResults = []; const now = new Date(); const dateNow = new Date(now.getTime() + now.getTimezoneOffset() * 60000); for (const key in actual) { let checkForMatch = false; // 先检查expected是否包含当前字段 if (!expected.hasOwnProperty(key)) { matchResults.push(false); continue; } // 处理日期字段 if (DATE_FIELDS.includes(key) && DATE_FORMAT_REGEX.test(actual[key])) { const actualDate = Date.parse(actual[key]); if (!isNaN(actualDate)) { // 对比时间戳(确保类型一致) checkForMatch = actualDate <= dateNow.getTime(); } } else { // 非日期字段直接对比值 checkForMatch = actual[key] === expected[key]; if (checkForMatch) { console.log(`Match found for key: ${key}`); } } matchResults.push(checkForMatch); } return matchResults; } console.log(matchVar(actual, expected));
关键修改点说明
DATE_FIELDS:明确指定需要处理日期的字段,避免对number这类非日期字段执行无效的日期解析。DATE_FORMAT_REGEX:提前校验日期格式,只有符合格式的字符串才会调用Date.parse,减少异常触发概率。- 修复匹配逻辑:非日期字段直接对比
actual[key]和expected[key]的取值,确保checkForMatch结果符合预期。 - 日期对比时使用
dateNow.getTime():和Date.parse返回的毫秒级时间戳保持类型一致,避免隐式转换导致的问题。
内容的提问来源于stack exchange,提问作者hungryhippos
相关产品推荐
相关产品推荐

