Answers:
现在,括号表示法可在所有主要浏览器上使用,但IE7及以下版本除外。
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
由于以下原因,使用方括号曾经是一个坏主意(Source):
此表示法在IE7中不起作用。 第一个代码段将在IE7中返回undefined。如果您碰巧对代码中的所有字符串都使用了括号表示法,并且想要迁移到
.charAt(pos)
,这是一个真正的痛苦:在代码中都使用了括号,并且没有简单的方法来检测是针对字符串还是数组/。目的。您不能使用此符号设置字符。由于没有任何警告,这确实令人困惑和沮丧。如果您正在使用该
.charAt(pos)
功能,则不会想这么做。
从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)中使用。在极端情况下,它们可以给出不同的结果。
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
charAt函数取决于在规范中如何将索引转换为Number 。
'hello'[undefined] // undefined
和'hello'.charAt(undefined) //h
null
的工作方式类似于undefined
,但请参见以下内容:"hello"["00"] // undefined
但是"hello".charAt("00") // "h"
和"hello"["0"] // "h"
[]
。
.charAt()
其参数执行额外的转换为Number
。仅供参考,如今几乎没有性能差异。
String.charAt()是原始标准,可在所有浏览器中使用。在IE 8+和其他浏览器中,您可以使用方括号表示法来访问字符,但IE 7及更低版本不支持。
如果有人真的想在IE 7中使用括号表示法,明智的做法是使用将该字符串转换为数组str.split('')
,然后将其用作与任何浏览器兼容的数组。
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
index
在chrome中也更快。
当您尝试访问超出范围或不是整数的索引时,会有所不同。
string[x]
如果if 是介于0和之间的整数x
,string
则返回第th个位置的字符,否则返回。x
string.length-1
undefined
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字符串是不可变的。
"😃".charAt(0)
将返回不可用的字符