JavaScript使用toUpperCase实现单词首字母大写时两变量取值不匹配原因
问题核心根源
JavaScript 中的字符串是不可变原始值,所有通过索引位置直接给字符串单个字符赋值的操作,都会被 JS 静默忽略,既不会修改原字符串,也不会抛出任何报错。
现有代码和预期不匹配的具体原因
- 代码里的
result[1][0] = result[1][0].toUpperCase();是完全无效的操作
因为字符串本身不可变,这行代码不会改写result[1]指向的原始字符串,赋值动作会被直接丢弃。传入的测试字符串匹配出的第二个单词是小写的"a",执行完这行赋值后,原字符串依然是小写"a",没有任何变化。
另外要注意:toUpperCase()的设计特性就是不修改调用它的原字符串,只会返回一个全大写的全新字符串。 - 代码里的
temp = result[1][0].toUpperCase();是有效操作
这行代码拿到了小写"a"调用toUpperCase()后生成的全新大写字符串"A",所以temp的值是"A"。因为原字符串从来没被真正改动过,result[1][0]始终是最初的小写"a",两者不匹配是必然结果。 - 原有代码还有逻辑冗余问题
两层循环里全程硬编码操作result[1],没有和外层循环的索引i关联,不管遍历到哪个单词,都只会反复尝试修改第二个单词的第一个字符,完全没有实现逐单词处理的目标。
符合要求的实现方案
严格按照要求,不使用map、replace这类替代方案,仅通过for循环搭配toUpperCase、toLowerCase完成标题格式转换:
function titleCase(str) { let regex = /[^0-9\s]+/g; let words = str.match(regex); // 外层for循环遍历每一个匹配到的单词 for (let i = 0; i < words.length; i++) { // 取当前单词的首字符,转成大写 const upperFirst = words[i][0].toUpperCase(); // 取当前单词除首字符外的剩余部分,全部转成小写 const lowerRest = words[i].slice(1).toLowerCase(); // 把拼接好的新格式单词赋值给数组对应位置,替代原单词 words[i] = upperFirst + lowerRest; } // 把处理好的单词按空格拼接为最终结果返回 return words.join(' '); } // 测试运行 titleCase("I'm a little tea pot"); // 输出结果:"I'm A Little Tea Pot"
内容的提问来源于stack exchange,提问作者Cihat Şaman
相关产品推荐
相关产品推荐

