JavaScript中确认是字符串的变量报Cannot read 'length' of undefined错误
错误原因
核心问题是你对Array.reduce的用法不符合规范:
- 你在处理第一个范围
1:5:2时,正则分割得到的数组是["1", "5", "2"] - reduce 未传入初始值时,第一次迭代的
curr是数组首元素"1",shorthand是第二个元素"5",此时调用interpretRange("1", "5")完全正常,所以控制台先输出string和1 - 你的 reduce 回调没有写返回语句,JS 中函数无显式返回时默认返回
undefined,第二次迭代时curr就变成了undefined,此时调用interpretRange(undefined, "2")- 首先执行
console.log(typeof num)输出undefined - 接下来执行
console.log(num.length)时直接触发Cannot read property 'length' of undefined的类型错误
- 首先执行
这就是你明明看到了正常的类型和长度打印,仍然收到报错的原因:错误发生在第二次函数调用时。
修复方案
首先修改 reduce 回调,主动返回处理后的值作为下一次迭代的curr:
range.split(/[-:..]/g) .reduce((curr, shorthand) => { const processed = interpretRange(curr, shorthand) interpreted.push([curr, processed]) return processed // 必须返回结果,作为下一轮的curr参数 })
另外还有两个需要补充处理的逻辑:
- 你当前代码缺失
expandList函数的实现,修复 reduce 问题后需要补全该函数才能正常运行 - 如果分割后的数组只有一个元素(比如示例中的第二个范围
3),reduce 不会执行回调,你需要额外处理这种单值场景,避免数据遗漏
内容的提问来源于stack exchange,提问作者bugsyb
相关产品推荐
相关产品推荐

