如何获取字符串的第一个字符?

776

我有一个字符串,需要获取它的第一个字符。

var x = 'somestring';
alert(x[0]); //in ie7 returns undefined

我该如何修复我的代码?


8
请注意 - 你可能没有可提取的字符! - corsiKa
22个回答

1283

charAt 可能会对 Unicode 字符给出错误的结果。使用 Array.from 替代:

Array.from('some string')[0];

16
曾在IE7、Chrome和Firefox上工作过。 - Yuriy Faktorovich
23
如果没有传递索引给x.charAt()方法,它也会返回第一个字符,即默认将索引设为0。请注意,这不会改变原始字符串本身。 - Mohammad Usman
1
@MohammadUsman 虽然你所说的是正确的,但不幸的是,在 Firefox 71 中没有任何参数的 charAt() 实际上比 chartAt(0) 慢约 10 倍。在此处查看自己:https://jsperf.com/testing-the-first-character-in-a-string/1 - Stephen M Irving
4
这种解决方案对于ASCII来说是好的,但一旦涉及到更多字符就会出现各种问题。 "".charAt(0) 返回 "\ud83d""café".charAt(3) 返回 e 并丢掉了重音符号等。 https://dev59.com/Q1oT5IYBdhLWcg3wngu1 提供了一些信息以及一个很好的替代方案(使用库)。 - Clément
4
дёәдәҶйҒҝе…ҚеҗҺжқҘи®ҝй—®иҖ…зҡ„ж··ж·Ҷпјҡx[0] дёҺ x.charAt(0) зҡ„ж•ҲжһңдёҖж ·пјҢйҷӨйқһдҪ е…іеҝғ IE 7гҖӮ - Clément
显示剩余3条评论

183

在 JavaScript 中,您可以这样做:

const x = 'some string';
console.log(x.substring(0, 1));


10
如果更喜欢使用子字符串函数,那么 x.slice(0,1) 是更短的代码。要获取最后一个字符,只需使用 x.slice(-1) - S.Serpooshan
2
如果你不认为每次阅读它并且必须思考它实际上应该达到什么目的时会浪费几秒钟生命,那么“slice”就更短了。永远地,只需使用实际表达你正在做什么的函数,当你尝试修复你所造成的混乱时,20年后你会更加快乐。#个人经验 - tekHedd
1
这应该是被接受的答案。整个“数组”东西很可爱,展示了将字符串转换为数组等操作,但问题实际上是,“如何从字符串开头获取一个单字符子串”;显然的答案是使用名为“substring”的函数。我的意思是,优雅胜过闪光。 - tekHedd
@tekHedd “整个‘数组’的东西很可爱”不,整个数组的东西是正确的:基本上所有其他解决方案(charAt、substring、regex、括号索引)在非ASCII字符串上都不能按预期工作。这对于手头的用例可能是好的,但数组版本始终可以正确地工作。其他答案应该至少提到注意事项。尽管TBF,就像被接受的答案也没有提到它一样。 - Jared Smith
@JaredSmith 不是的,也许你在想 Python 2 或 C。这个十年里的 JavaScript 正确处理多字节代码点。例如:"₳℮∑┌".substring(2) 返回 "∑┌"。 - tekHedd
@tekHedd不一定,''.substring(0, 1)并没有产生预期的空字符串,但是解构可以。 - Jared Smith

125
你可以使用其中任何一个。 它们之间有一点差别,所以在条件语句中使用时要小心。

var string = "hello world";
console.log(string.slice(0,1));     //o/p:- h
console.log(string.charAt(0));      //o/p:- h
console.log(string.substring(0,1)); //o/p:- h
console.log(string.substr(0,1));    //o/p:- h
console.log(string[0]);             //o/p:- h
console.log(string.at(0));          //o/p:- h


var string = "";
console.log(string.slice(0,1));     //o/p:- (an empty string)
console.log(string.charAt(0));      //o/p:- (an empty string)
console.log(string.substring(0,1)); //o/p:- (an empty string)
console.log(string.substr(0,1));    //o/p:- (an empty string)
console.log(string[0]);             //o/p:- undefined
console.log(string.at(0));          //o/p:- undefined


5
缺失的字符串是 string 的前1个字符; :) - Luckylooke
1
缺少 string.at(0)。 - ya.teck

37

all() 方法的示例

首先string.charAt(index)

返回 index 索引处的字符。

var str = "Stack overflow";

console.log(str.charAt(0));

第二步string.substring(start,length);

返回字符串中从索引start开始并在长度length之后停止的子字符串。

在这里,您只想要第一个字符,因此:start=0length=1

var str = "Stack overflow";

console.log(str.substring(0,1));

替代方法string[index]

字符串是字符数组。因此,您可以像获取数组的第一个单元格一样获取第一个字符。

返回字符串中索引index处的字符

var str = "Stack overflow";

console.log(str[0]);


使用console.time()计时单个操作并不是性能测试的合理或准确方法。当你只计时单个操作时,当然它们之间没有太大的差异。但实际上这些方法的表现是不同的。 - Stephen M Irving

34

const x = 'some string';
console.log(x.substring(0, 1));


11
substring 操作比 charAt 操作慢大约 90%,详见 jsperf - moritzwick

17
var x = "somestring"
alert(x.charAt(0));

charAt()方法允许您指定所需字符的位置。

您试图做的是获取数组"x"在某个位置上的字符,但由于X未定义为数组,因此这样是行不通的。


16

你甚至可以使用slice来截取所有其他字符:

x.slice(0, 1);

这种方法将是解决此问题中性能最差的方法之一。次优的。 - Stephen M Irving

8
var str="stack overflow";

firstChar  = str.charAt(0);

secondChar = str.charAt(1);

已测试过在IE6+FFChromesafari浏览器中。


12
你发这个回答有什么原因吗?它似乎是被采纳的答案的重复。 - Manatherin
5
他们提供了一些额外的信息(尽管它应该是一个注释)...例如它在哪些浏览器中进行了测试。我知道indexOf在IE8中不能正常工作,这对我很重要。我实际上开始搜索charAt的兼容性,直到我看到这个答案深处的位置。 - gloomy.penguin

6

您也可以尝试这个:

x.substr(0, 1);

substr() 被认为是一种遗留函数,如果可能的话应该避免使用。它实际上不是 JS 语言的一部分,随时可能被移除。在所有新代码中都要避免使用 substr(),旧代码应该重构以使用其他方法。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr - Stephen M Irving

4

看起来我来晚了,但尝试下面的解决方案,我个人认为是最好的解决方案:

var x = "testing sub string"
alert(x[0]);
alert(x[1]);

输出应该显示以下值的警报: “t” “e”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接