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

时间:2011-05-09 23:55:45

标签: javascript string

我有什么理由使用string.charAt(x)代替括号表示string[x]吗?

6 个答案:

答案 0 :(得分:222)

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

// Bracket Notation
"Test String1"[6]

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

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

  

此符号在IE7中不起作用。   第一个代码段将返回   在IE7中未定义。如果你碰巧使用   所有字符串的括号表示法   你的代码,你想迁移   到.charAt(pos),这是一个真正的痛苦:   在您的代码中使用括号   并且没有简单的方法来检测是否   这是一个字符串或一个   阵列/对象。

     

您无法使用此表示法设置字符。因为没有警告   任何一种,这真的令人困惑   令人沮丧的。如果你正在使用   .charAt(pos)功能,你不会   我很想做到这一点。

答案 1 :(得分:85)

来自MDN

  

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

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

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

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

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

     

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

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

答案 2 :(得分:67)

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

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

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

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

答案 3 :(得分:11)

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

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

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

答案 4 :(得分:9)

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

CharAt vs index 1

ChartAt vs index 2

ChartAt vs index 3

答案 5 :(得分:2)

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

string[x]如果x是0到string之间的整数,则返回x中第string.length-1位的字符,并返回{{1} }。

undefined使用解释的过程herestring.charAt(x)转换为整数(如果x是非整数,则将x向下舍入并返回如果xparseInt(x),则返回0,如果整数在0和NaN之间,则返回该位置的字符,否则返回一个空字符串。

以下是一些示例:

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 无效的原因是因为Javascript strings are immutable