JavaScript字符串首字母大写函数修复:第二个字符丢失问题排查
问题分析与修复
原函数出现第二个字符被忽略的核心原因是逻辑错误导致字符遗漏:
- 当
i=0时,代码直接拼接了str[0].toUpperCase(),但从i=1开始,else分支直接拼接str[i+1],这就跳过了str[1](原字符串的第二个字符)。 - 循环条件
i < str.length-1虽然试图通过i+1覆盖后续字符,但结合上述逻辑,最终导致部分字符丢失。
修正后的函数
const str = "hello stackoverflow community"; function afterSpaceUpper(str) { if (!str) return ""; // 处理空字符串的边界情况 let result = str[0].toUpperCase(); for (let i = 1; i < str.length; i++) { // 判断前一个字符是否为空格,是则当前字符转大写 if (str[i-1] === " ") { result += str[i].toUpperCase(); } else { result += str[i]; } } return result; } console.log(afterSpaceUpper(str)); // 输出: Hello Stackoverflow Community
修正说明
- 先单独处理第一个字符转大写,避免原逻辑中跳过第二个字符的问题
- 循环从
i=1遍历到字符串末尾,每个字符都被处理,无遗漏 - 通过判断前一个字符是否为空格来决定当前字符是否转大写,逻辑更清晰直观
优化方案
方案1:split + map + join(直观易维护)
这种方式逻辑清晰,容易理解和修改,还能处理连续空格的边界情况:
const str = "hello stackoverflow community"; function capitalizeWords(str) { return str.split(" ").map(word => { if (!word) return word; // 保留连续空格中的空字符串,避免丢失空格 return word[0].toUpperCase() + word.slice(1); }).join(" "); } console.log(capitalizeWords(str));
方案2:正则表达式替换(简洁高效)
适合不需要复杂边界处理的场景,代码最精简:
const str = "hello stackoverflow community"; function capitalizeWordsRegex(str) { // \b 匹配单词边界,替换每个单词开头的小写字母为大写 return str.replace(/\b[a-z]/g, char => char.toUpperCase()); } console.log(capitalizeWordsRegex(str));
内容的提问来源于stack exchange,提问作者adila maloul
相关产品推荐
相关产品推荐

