我是编程新手,我正在开发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
提前感谢您对此问题的任何帮助/指导。
答案 0 :(得分:4)
str.slice(x, y)
将返回索引x
和索引y
之间字符串的字符。
如果你没有传递y
(你没有),它默认为字符串的结尾。
因此,str.slice(1)
将返回从索引1
开始的字符串中的所有字符
由于索引从零开始,这意味着除了第一个字符之外的所有内容。
答案 1 :(得分:0)
slice(1)返回字符串的其余部分,第一个字符后的所有内容。所以你通过将第一个字母(大写)和字符串的其余部分加在一起得到整个字符串。
答案 2 :(得分:0)
你的困惑很自然。几乎每个程序员在他们生命中的某个时刻都会off by one error。所以我将使用示例向您解释:
考虑字符串"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个索引(0
到12
)。索引位于字符之间。
注意:最后一个索引始终是数组的长度。
程序员常犯的错误是,当他们想到一个数组时,他们会根据方框而不是指数来思考。
重要提示:数组是根据其索引而不是方框数来描述的。
现在让我们看一下slice
方法。此方法采用两个索引,第二个索引是可选的。它返回给定字符串的子字符串。
例如,如果我只想"World"
"Hello World!"
,我会像这样提取它("World"
从索引6
开始,到索引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
。因此它返回索引11
之后的所有内容。
理解?现在您了解了fencepost问题。
这就是你拨打slice(0)
时获得整个字符串的原因;当你拨打slice(1)
时,你在第一个角色后的所有内容。
在处理数组时,始终记得用索引而不是框来思考。
在字符之间读取。