-1

我是编程新手,正在研究 LearnStreet 的“写作功能”。我的问题是:

function capitalizeFirst(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
}

我明白了,如果它只是:

return str.charAt(0).toUpperCase();

只有第一个字母会被返回并大写,但为什么添加会返回.slice(1)整个字符串?

如果是:

capitalizeFirst("i am apple");
// "I am apple" is returned

但与

function capitalizeFirst(str) {
    return str.charAt(0).toUpperCase() + str.slice(0); // 0 instead of 1
}

capitalizeFirst("i am apple");
// "Ii am apple" is returned

提前感谢您对此问题的任何帮助/指导。

4

3 回答 3

4

str.slice(x, y)x将返回 index和 index之间的字符串字符y
如果你不通过y(你不通过),它默认到字符串的末尾。

因此,str.slice(1)将返回字符串中从 index 开始的所有字符1
由于索引是从零开始的,这意味着除了第一个字符之外的所有内容。

于 2012-12-31T16:36:24.170 回答
0

你的困惑是自然的。几乎每个程序员在他们生命中的某个时刻都会犯一个错误。因此,我将使用示例向您解释:

考虑字符串"Hello World!"。在计算机中,它将在内存中表示为字符数组。它看起来像这样:

+---+---+---+---+---+---+---+---+---+---+---+---+
| H | e | l | l | o |   | W | o | r | l | d | ! |
+---+---+---+---+---+---+---+---+---+---+---+---+
0   1   2   3   4   5   6   7   8   9  10  11  12

现在我想让你注意只有 12 个框(字符),但有 13 个索引(0to 12)。索引在字符之间。

注意:最后一个索引始终是数组的长度。

程序员常犯的一个错误是,当他们考虑数组时,他们考虑的是框而不是索引。

重要提示:数组是根据其索引而不是框数来描述的。

现在让我们看看slice方法。此方法采用两个索引,第二个是可选的。它返回给定字符串的子字符串。

例如,如果我只想要"World"from"Hello World!"我会像这样提取它("World"从 index 开始并在 index6结束11):

"Hello World!".slice(6, 11); // "World"

如果我想要空格后的所有内容"Hello World!"(即如果我想要"World!"),那么我可以使用简短形式而不是slice(6, 12). 这里12是隐含的,所以我可以简单地使用slice(6)

"Hello World!".slice(6); // "World!"

我什至可以在不知道字符串长度的情况下使用负索引来提取字符串的最后一个字符:

"Hello World!".slice(-1); // "!"

这里-1代表索引length - 1。由于length被定义为最后一个索引,因此12 - 1在这种情况下很简单。因此它返回 index 之后的所有内容11

明白了吗?所以现在你了解了栅栏问题。

这就是为什么你在调用时得到整个字符串的原因slice(0);和你打电话时第一个字符之后的所有内容slice(1)

在处理数组时,永远记住要考虑索引而不是框。

在字符之间阅读。

于 2012-12-31T17:11:13.793 回答
0

slice(1) 返回字符串的其余部分,即第一个字符之后的所有内容。因此,您可以通过将第一个字母(大写)和字符串的其余部分相加来获得整个字符串。

于 2012-12-31T16:37:29.150 回答