string.charAt(x)或string [x]?

Ble*_*der 233 javascript string

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

Bri*_*ter 228

括号表示法现在适用于所有主流浏览器,IE7及更低版本除外.

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)
Run Code Online (Sandbox Code Playgroud)

由于这些原因,使用括号过去是个坏主意(来源):

这种表示法在IE7中不起作用. 第一个代码片段将在IE7中返回undefined.如果您碰巧在代码中使用括号表示法并且想要迁移到.charAt(pos),那么这真的很痛苦:在您的代码中使用括号,并且没有简单的方法来检测字符串或数组是否为/宾语.

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

  • 没错,符号在IE7中不起作用,但现在这不是一个巨大的劣势.同时,我在测试中使用charAt vs indexer时,在对象中装入字符串时,基准测试显示性能降低了三倍.我知道这不是真的相关,但仍值得注意.https://jsfiddle.net/mdasxxd2/ (20认同)
  • 更准确的测试(benchmark.js)https://esbench.com/bench/579609a0db965b9a00965b9e (5认同)
  • 尽管得分最高,但该答案现在(2019年)已明显过时。[下面引用MDN的答案](/sf/answers/416066521/)应该改为引用。 (3认同)

Mat*_*all 88

来自MDN:

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

return 'cat'.charAt(1); // returns "a"
Run Code Online (Sandbox Code Playgroud)

另一种方法是将字符串视为类似于数组的对象,其中每个单独的字符对应于数字索引.自IE第一版以来,大多数浏览器都支持此功能.它在ECMAScript 5中标准化:

return 'cat'[1]; // returns "a"
Run Code Online (Sandbox Code Playgroud)

第二种方式需要ECMAScript 5支持(在某些旧版浏览器中不支持).

在这两种情况下,尝试更改单个字符都不起作用,因为字符串是不可变的,即它们的属性既不是"可写"也不是"可配置".

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

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

Mar*_*rkG 72

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

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

'hello'[true] //undefined
'hello'.charAt(true) // 'e'
Run Code Online (Sandbox Code Playgroud)

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

  • 这全心全意地说服我继续使用`[]`. (11认同)
  • 这个答案应该向上移动,它实际上解释了两种方法之间存在差异.其他答案谈到IE7的兼容性(我的意思是真的吗?),而这个答案解释了一个非常真实的陷阱. (5认同)
  • `null`就像`undefined`,但看到这个:``hello"["00"] // undefined`但是``hello".charAt("00")//"h"`和``hello"[ "0"] //"h"` (3认同)
  • 这也意味着“.charAt()”将其参数执行额外的转换为“Number”。仅供参考,现在几乎没有性能差异。 (3认同)
  • 另外,`"hello"[313]` 是 `undefined`,`"hello".charAt(313)` 是 `""`。 (3认同)

Don*_*uck 18

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

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
Run Code Online (Sandbox Code Playgroud)

另一个区别是分配给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
Run Code Online (Sandbox Code Playgroud)

分配给string[x]不起作用的原因是因为Javascript 字符串是不可变的


Cha*_*thJ 11

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

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

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"
Run Code Online (Sandbox Code Playgroud)

  • IE从8开始支持括号表示法. (5认同)
  • 在处理Unicode时,此方法会中断:http://mathiasbynens.be/notes/javascript-unicode (3认同)

Arm*_*ian 8

测试字符串索引访问器与charAt()方法时的结果非常有趣.似乎Chrome是唯一喜欢charAt更多的浏览器.

CharAt vs index 1

ChartAt vs index 2

ChartAt vs index 3

  • 现在已经不是这样了。`index` 在 chrome 中也更快。 (3认同)