为什么实现首字母大写时toLowerCase()与replace()链式调用不符合预期?
问题原因
链式调用写法出错的核心原因是原始item变量未被重新赋值,两个步骤操作的不是同一个字符串对象:
- 原正确写法中,先执行
item = item.toLowerCase()将item覆盖为全小写字符串,后续item[0]取的是全小写后的首字母,替换逻辑可以正常匹配执行。 - 链式写法中,
item.toLowerCase()仅临时生成了一个全小写的新字符串,没有修改原item的值。此时replace(item[0], item[0].toUpperCase())中用到的item[0]取的都是原始输入单词的首字母:如果原始首字母为大写,全小写的临时字符串中不存在对应的大写字符,replace匹配失败,不会执行替换操作。
以你给出的输入JAvaScript is The best为例,第一个单词的原始值是JAvaScript,item[0]为大写的J,item.toLowerCase()生成的临时字符串是javascript,字符串中没有大写的J,replace匹配不到目标字符,直接返回全小写的javascript,就出现了你看到的错误输出。
修复方案
如果要保留链式调用的写法,只需要保证replace匹配的是全小写后的首字母即可,推荐用正则匹配首字符的写法,兼容性和稳定性更好:
newArr.push(item.toLowerCase().replace(/^./, match => match.toUpperCase()));
内容的提问来源于stack exchange,提问作者Abhishek Pragada
相关产品推荐
相关产品推荐

