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

Javascript string.charAt(x)还是string[x]?,javascript,string,Javascript,String,有什么理由我应该使用string.charAt(x)而不是括号表示法string[x]?括号表示法现在适用于所有主要浏览器,IE7及以下浏览器除外 // Bracket Notation "Test String1"[6] // charAt Implementation "Test String1".charAt(6) 过去使用括号是个坏主意,原因如下(): 此符号在IE7中不起作用。 第一个代码段将返回 未在IE7中定义。如果你碰巧使用 所有字符串的括号符号 通过您的代码,您想要迁移 对

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

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

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)
过去使用括号是个坏主意,原因如下():

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

您不能使用此符号设置字符。因为没有警告 不管是哪一种,这都是令人困惑和困惑的 令人沮丧的。如果您正在使用
.charAt(pos)
函数,您不会 我一直想做这件事

发件人:

有两种方法可以访问字符串中的单个字符。第一个是方法,是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)
String.charAt()是原始标准,适用于所有浏览器。 在IE8+和其他浏览器中,您可以使用括号表示法访问字符,但IE7及以下版本不支持

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

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

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


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

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

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

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

当您尝试访问一个超出范围或不是整数的索引时,会有差异

string[x]
如果
x
是介于0和
string.length-1
之间的整数,则返回
string
x
第th位的字符,否则返回
未定义的

string.charAt(x)
使用说明的过程将
x
转换为整数(如果
x
为非整数,则基本上向下舍入
x
,如果
parseInt(x)
NaN
,则返回0)然后,如果整数介于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)
则是一个错误(如预期的那样):


分配给
string[x]
不起作用的原因是。

IE从8开始就支持括号表示法。此方法在处理Unicode时中断:此方法在处理非常大的字符串时效率低下,因为它会复制内存中的数据(原始字符串和数组)。True,ECMA 5还没有在所有浏览器上得到支持,但它在大多数浏览器上都得到了支持:这意味着IE9及以上版本和所有Chrome/Firefox版本:没有任何JS功能将得到100%的支持,我觉得避免使用ECMA 5功能将使我们永远留在过去……还有
'hello'[undefined]//undefined
'hello'(未定义)//h
null
的工作原理类似于
未定义
,但请看:
“hello”[“00”]//未定义
“hello”。charAt(“00”)/“h”
“hello”[“0”]/“h”
这让我确信继续使用
[]
。这个答案应该向上移动,它实际上解释了这两种方法之间的区别。其他答案谈到了IE7的兼容性(我是说真的吗?),而这个答案解释了一个非常真实的陷阱。如果有人想知道为什么
“hello”。charAt(NaN)
'h'
,请参阅。没错,这种符号在IE7中不起作用,但这在当今并不是一个巨大的缺点。同时,我的基准测试显示,当字符串被装箱到对象中时,在Chrome中使用charAt vs indexer时,性能下降了三倍。我知道这并不真正相关,但仍然值得注意。更准确的测试(benchmark.js)尽管得分最高,但这个答案现在(2019年)已明显过时。应改为参考。2021年在Chrome 89上。情况不再如此。
index
在Chrome上也快了很多。警告:对表情符号或任何其他超过(AKA)
“@KyleMit
”@DonaldDuck-右-因此对表情符号使用任一语法…将返回一个无法使用的字符。
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