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

IT技术 javascript string
2021-02-02 21:15:44

有什么理由我应该使用string.charAt(x)而不是括号表示法string[x]吗?

6个回答

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

// Bracket Notation
"Test String1"[6]

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

过去使用方括号是个坏主意,原因如下(来源):

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

您不能使用此表示法设置字符。由于没有任何形式的警告,这确实令人困惑和沮丧。如果您正在使用该 .charAt(pos)功能,您就不会想要这样做。

更准确的测试(benchmark.js)esbench.com/bench/579609a0db965b9a00965b9e
2021-03-25 21:15:44
确实,该符号在 IE7 中不起作用,但这在当今并不是一个巨大的缺点。同时,当字符串被装箱到对象中时,我所做的基准测试显示,在 Chrome 中使用 charAt 与索引器时,性能下降了三倍。我知道这并不重要,但仍然值得注意。jsfiddle.net/mdasxxd2
2021-03-27 21:15:44
2021 年在 Chrome 89 上没有显着的性能差异
2021-04-04 21:15:44
尽管是得分最高的答案,但现在(2019 年)已经过时了。应该参考下面引用 MDN 的答案
2021-04-07 21:15:44

来自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)。
诚然,ECMA 5 尚未在所有浏览器上得到支持,但在大多数浏览器上都受支持:意味着 IE9 及更高版本和所有 Chrome/Firefox 版本: kangax.github.io/compat-table/es5/#Property_access_on_strings 没有 JS 功能将永远得到 100% 支持,我觉得避免使用 ECMA 5 功能将使我们永远成为过去......
2021-03-24 21:15:44

它们可以在边缘情况下给出不同的结果。

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

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

charAt 函数取决于索引如何转换为规范中的数字

另外"hello"[313]undefined"hello".charAt(313)""
2021-03-15 21:15:44
这也意味着.charAt()对其参数执行额外的转换为Number. 仅供参考,现在几乎没有性能差异。
2021-03-18 21:15:44
null像 一样工作undefined,但请看:"hello"["00"] // undefined但是"hello".charAt("00") // "h""hello"["0"] // "h"
2021-03-21 21:15:44
这全心全意地说服我继续使用[].
2021-04-01 21:15:44
这个答案应该向上移动,它实际上解释了两种方法之间存在差异。其他答案讨论了 IE7 的兼容性(我的意思是真的?)而这个答案解释了一个非常真实的陷阱。
2021-04-09 21:15:44

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

string[x]返回if 中x第 th 位置的字符是 0 和 之间的整数否则返回stringxstring.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 字符串是不可变的

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

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

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"
此方法在处理 Unicode 时会中断:mathiasbynens.be/notes/javascript-unicode
2021-03-15 21:15:44
这种方法在处理非常大的字符串时效率很低,因为它会复制内存中的数据(原始字符串和数组)。
2021-03-20 21:15:44
IE 从 8 开始支持括号表示法。
2021-04-05 21:15:44