我有什么理由使用string.charAt(x)
代替括号表示string[x]
吗?
答案 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支持(在某些旧版浏览器中不支持)。
在这两种情况下,尝试更改单个字符都不起作用,因为字符串是不可变的,即它们的属性既不是“可写”也不是“可配置”。
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
的浏览器。
答案 5 :(得分:2)
当您尝试访问超出范围或不是整数的索引时,会有所不同。
string[x]
如果x
是0到string
之间的整数,则返回x
中第string.length-1
位的字符,并返回{{1} }。
undefined
使用解释的过程here将string.charAt(x)
转换为整数(如果x
是非整数,则将x
向下舍入并返回如果x
是parseInt(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。