是string.charAt(x)还是string [x]?


Answers:


242

现在,括号表示法可在所有主要浏览器上使用,但IE7及以下版本除外。

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)

由于以下原因,使用方括号曾经是一个坏主意(Source):

此表示法在IE7中不起作用。 第一个代码段将在IE7中返回undefined。如果您碰巧对代码中的所有字符串都使用了括号表示法,并且想要迁移到.charAt(pos),这是一个真正的痛苦:在代码中都使用了括号,并且没有简单的方法来检测是针对字符串还是数组/。目的。

您不能使用此符号设置字符。由于没有任何警告,这确实令人困惑和沮丧。如果您正在使用该 .charAt(pos)功能,则不会想这么做。


21
没错,这种表示法在IE7中不起作用,但这在当今并不是一个很大的缺点。同时,我所做的基准测试表明,将字符串装在对象中时,在Chrome中使用charAt vs indexer时,性能下降了三倍。我知道这并不重要,但仍然值得注意。jsfiddle.net/mdasxxd2
Siderite Zackwehdex

5
更加准确的测试(benchmark.js)esbench.com/bench/579609a0db965b9a00965b9e
NoName提供了

3
尽管得分最高,但该答案现在(2019年)已明显过时。下面引用MDN的答案应改为引用
斯科特·马丁

97

MDN

有两种方法可以访问字符串中的单个字符。第一种是charAt方法,是ECMAScript 3的一部分:

return 'cat'.charAt(1); // returns "a"

另一种方法是将字符串当作数组对象,其中每个字符对应一个数字索引。自从第一个版本以来,大多数浏览器都支持此功能,但IE除外。它在ECMAScript 5中标准化:

return 'cat'[1]; // returns "a"

第二种方法需要ECMAScript 5支持(某些较旧的浏览器不支持)。

在这两种情况下,尝试更改单个字符均不起作用,因为字符串是不可变的,即字符串的属性既不是“可写的”也不是“可配置的”。

  • str.charAt(i) 如果需要IE6 / IE7兼容性,则从兼容性角度来看更好。
  • str[i] 更加现代,可在IE8 +和所有其他浏览器(所有Edge / Firefox / Chrome,Safari 2+,所有iOS / Android)中使用。

19
的确,所有浏览器均不支持ECMA 5,但MOST浏览器均支持ECMA 5:意味着IE9及更高版本以及所有Chrome / Firefox版本: kangax.github.io/compat-table/es5/#Property_access_on_strings永远 不会有JS功能得到100%的支持,我觉得避免使用ECMA 5功能将永远让我们过去……
Danny R

83

在极端情况下,它们可以给出不同的结果。

'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'

'hello'[true] //undefined
'hello'.charAt(true) // 'e'

charAt函数取决于在规范中如何将索引转换为Number 。


'hello'[undefined] // undefined'hello'.charAt(undefined) //h
Juan Mendes

3
null的工作方式类似于undefined,但请参见以下内容:"hello"["00"] // undefined但是"hello".charAt("00") // "h""hello"["0"] // "h"
panzi

11
这全心全意地说服我继续使用[]
接近

这也意味着将.charAt()其参数执行额外的转换为Number。仅供参考,如今几乎没有性能差异。
КонстантинВан

7
这个答案应该向上移动,它实际上解释了这两种方法之间的区别。其他答案是关于IE7的兼容性(我的意思是真的吗?),而这个答案则说明了一个非常现实的陷阱。
Storm Muller '18

11

String.charAt()是原始标准,可在所有浏览器中使用。在IE 8+和其他浏览器中,您可以使用方括号表示法来访问字符,但IE 7及更低版本不支持。

如果有人真的想在IE 7中使用括号表示法,明智的做法是使用将该字符串转换为数组str.split(''),然后将其用作与任何浏览器兼容的数组。

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"

5
IE从8开始支持括号表示法。
mrec 2014年

3
处理Unicode时,此方法会中断:mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

当处理很大的字符串时,此方法效率不高,因为它将复制内存中的数据(原始字符串和数组)。
丹尼尔(Daniel)


5

当您尝试访问超出范围或不是整数的索引时,会有所不同。

string[x]如果if 是介于0和之间的整数xstring则返回第th个位置的字符,否则返回。xstring.length-1undefined

string.charAt(x)转换x使用过程中的整数解释这里(其基本上舍x下来,如果x是一个非整数,并返回0,如果parseInt(x)NaN),然后,如果此整数为0之间,并在返回该位置的字符string.length-1,并且返回一个空字符串,否则。

这里有些例子:

"Hello"[313]    //undefined
"Hello".charAt(313)    //"", 313 is out of bounds

"Hello"[3.14]    //undefined
"Hello".charAt(3.14)    //'l', rounds 3.14 down to 3

"Hello"[true]    //undefined
"Hello".charAt(true)    //'e', converts true to the integer 1

"Hello"["World"]    //undefined
"Hello".charAt("World")    //'H', "World" evaluates to NaN, which gets converted to 0

"Hello"[Infinity]    //undefined
"Hello".charAt(Infinity)    //"", Infinity is out of bounds

另一个区别是,分配给string[x]什么都不做(这可能会造成混淆),分配给string.charAt(x)一个错误(如预期的那样):

var str = "Hello";
str[0] = 'Y';
console.log(str);    //Still "Hello", the above assignment did nothing
str.charAt(0) = 'Y';    //Error, invalid left-hand side in assignment

之所以string[x]无法分配,是因为Javascript字符串是不可变的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.