如何修复统计CamelCase单词数函数的边界访问错误?
修复CamelCase单词统计函数的问题
首先,你的函数出现报错的核心原因是当遍历到字符串最后一个字符时,word[i+1]会变成undefined,调用toLowerCase()自然会触发无法读取属性的错误。除此之外,原函数的计数逻辑也存在问题(初始值错误、连续大写时提前终止遍历)。
以下是修复后的完整函数:
function singleWordChecking(word) { // 处理空字符串边界 if (!word) return 0; // 非空字符串至少包含1个单词 let singleWordCount = 1; for (let i = 1; i < word.length; i++) { const currentChar = word[i]; const prevChar = word[i - 1]; // 当前字符是大写时,判断是否为新单词的起始 if (currentChar.toUpperCase() === currentChar) { // 情况1:前一个字符是小写 → 新单词开头(如HelloWorld中的W) if (prevChar.toLowerCase() === prevChar) { singleWordCount++; } else { // 情况2:前一个字符是大写,但下一个字符是小写 → 缩写结束,新单词开始(如IPAddress中的A) const nextChar = word[i + 1]; if (nextChar && nextChar.toLowerCase() === nextChar) { singleWordCount++; } } } } return singleWordCount; }
测试验证
console.log(singleWordChecking('HelloWorldWideWeb')); // 输出4 console.log(singleWordChecking('HelloWWW')); // 输出2 console.log(singleWordChecking('IPAddress')); // 输出2 console.log(singleWordChecking('ID')); // 输出1
关键修复点说明
- 边界处理:
- 增加空字符串判断,避免无意义计算。
- 访问
word[i+1]前先判断该索引是否存在(nextChar && ...),防止读取undefined的属性。
- 计数逻辑修正:
- 初始计数设为1,因为任何非空的CamelCase命名至少包含1个单词。
- 移除原函数中遇到连续大写就直接
return的错误逻辑,改为判断连续大写后是否跟随小写字符(以此区分缩写和新单词的边界)。
- 遍历逻辑优化:
- 从索引1开始遍历(跳过第一个字符,因为它是第一个单词的起始),通过对比当前字符与前/后字符的大小写,准确识别新单词的分隔点。
内容的提问来源于stack exchange,提问作者Victor_Yeung
相关产品推荐
相关产品推荐

