JavaScript字符串首字母大写代码疑问:能否直接将字符串字符当作数组元素操作?
关于JavaScript字符串下标访问的疑问解答
核心问题答案
当然可以直接用方括号[]访问字符串的单个字符,不用先把字符串转换成数组。
为什么能这么做?
JavaScript里的字符串属于类数组对象,天生支持通过下标(从0开始)获取对应位置的字符,比如"hello"[0]就能拿到"h"。不过要注意:字符串是不可变的,你没法直接通过下标修改字符(比如str[0] = "H"这种写法不会生效),所以w3resource的代码里是通过str[i][0].toUpperCase() + str[i].substr(1)的方式,把大写后的首字母和剩余子串拼接成新字符串,再赋值给str[i],本质是替换整个单词,不是修改原字符串的单个字符。
两种代码对比
你的代码思路是:
- 把原字符串按空格拆成单词数组
- 对每个单词,再拆成字符数组
- 修改字符数组的第一个元素为大写
- 把字符数组拼接回单词,替换原数组中的单词
- 最后把所有单词拼接成字符串返回
function capFirstLetters(str) { const words = str.split(" "); for (let i = 0; i < words.length; i++) { const letters = words[i].split(""); letters[0] = letters[0].toUpperCase(); words[i] = letters.join(""); } return words.join(" "); } console.log(capFirstLetters("i wrote a program that capitalizes the first letter of each word in a string."));
w3resource的代码思路更简洁:
- 同样先拆成单词数组
- 直接通过下标取每个单词的第一个字符转大写,再拼接上该单词从第二个字符开始的子串(用
substr(1)实现) - 把新生成的单词替换原数组中的项,最后拼接返回
function capital_letter(str) { str = str.split(" "); for (var i = 0, x = str.length; i < x; i++) { str[i] = str[i][0].toUpperCase() + str[i].substr(1); } return str.join(" "); } console.log(capital_letter("i wrote a program that capitalizes the first letter of each word in a string."));
两种方法都能实现需求,但后者省去了“拆字符数组再拼接”的步骤,利用字符串的下标访问特性简化了代码。
补充小提示
- 字符串下标访问在ES5及之后的规范里是标准特性,现代浏览器和Node.js都完全支持
- 如果要兼容非常老旧的环境(比如IE8及以前),可以用
charAt(index)方法替代,比如str[i].charAt(0)和str[i][0]效果一样
内容的提问来源于stack exchange,提问作者Simorq
相关产品推荐
相关产品推荐

