正如另外指出的,字符串在 JavaScript 中是不可变的,这意味着你不能改变它们的值。如果要将字符串的第一个字母变为大写,则必须构造一个 new 字符串
str[0].toUpperCase() + str.slice(1)
或者更一般地说,如果我们在特定索引处使用大写字母,i
str.slice(0,i) + str[i].toUpperCase() + str.slice(i + 1)
我们可以创建一个函数toUpperCaseAt,它接受一个字符串和一个索引并为我们执行这个操作。
const toUpperCaseAt = (str = "", i = 0) =>
i >= str.length
? str
: str.slice (0, i) + str [i] .toUpperCase () + str.slice (i + 1)
接下来,我们编写一个简单的递归函数titleCase,逐个遍历字符串。
- 基本情况:索引超出范围 - 返回输入字符串
- 归纳案例 1:索引未超出范围且索引为 0 - 第一个字母应始终大写
- 归纳案例 2:索引不是越界,不是 0,并且索引当前引用一个空格字符 - 下一个字母大写
- 归纳案例 3:索引没有越界,不是 0,也不是空格 - 前进到下一个索引
这个答案不需要依赖像String.prototype.split或Array.prototype.join这样的高级内置函数——而是向您展示如何使用您自己创建的简单函数来实现结果。
const titleCase = (str = "", i = 0) =>
i >= str.length
? str
: i === 0
? titleCase (toUpperCaseAt (str, i), 1)
: str [i] === " "
? titleCase (toUpperCaseAt (str, i + 1), i + 1)
: titleCase (str, i + 1)
console.log (titleCase ('hello, my name is me.'))
// Hello, My Name Is Me.
如果我们不确定它是如何工作的,我们甚至可以删除 String.prototype.slice 依赖项
const slice = (str = "", from = 0, to = str.length) =>
from >= to
? ''
: str [from] + slice (str, from + 1, to)
现在整件事在一起
const slice = (str = "", from = 0, to = str.length) =>
from >= to
? ""
: str [from] + slice (str, from + 1, to)
const toUpperCaseAt = (str = "", i = 0) =>
i >= str.length
? str
: slice (str, 0, i) + str [i] .toUpperCase () + slice (str, i + 1)
const titleCase = (str = "", i = 0) =>
i >= str.length
? str
: i === 0
? titleCase (toUpperCaseAt (str, i), 1)
: str [i] === " "
? titleCase (toUpperCaseAt (str, i + 1), i + 1)
: titleCase (str, i + 1)
console.log (titleCase ('hello, my name is me.'))
// Hello, My Name Is Me.