有什么理由我应该使用string.charAt(x)
而不是括号表示法string[x]
吗?
string.charAt(x) 还是 string[x]?
括号表示法现在适用于所有主要浏览器,IE7 及以下版本除外。
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
过去使用方括号是个坏主意,原因如下(来源):
此表示法在 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 函数取决于索引如何转换为规范中的数字。
当您尝试访问超出范围或不是整数的索引时,会有所不同。
string[x]
返回if 中x
第 th 位置的字符是 0 和 之间的整数,否则返回。string
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 字符串是不可变的。
String.charAt() 是原始标准,适用于所有浏览器。在 IE 8+ 和其他浏览器中,您可以使用括号表示法来访问字符,但 IE 7 及以下版本不支持它。
如果有人真的想在 IE 7 中使用括号表示法,明智的做法是将字符串转换为数组str.split('')
,然后将其用作数组,与任何浏览器兼容。
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"