2011-05-09 58 views

回答

194
// Bracket Notation 
"Test String1"[6] 

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

这是一个坏主意,用括号内,这些原因(Source):

这种表示法并不在IE7工作。 第一个代码片段将返回在IE7中未定义的 。如果你碰巧使用 字符串所有 在你的代码中的括号标记,并要迁移 到.charAt(pos),这是一个真正的痛苦: 支架都是用在你的代码 ,有没有简单的方法,如果 这是检测对于一个字符串或一个 数组/对象。

您不能使用此表示法设置字符。由于 没有任何警告,这是令人困惑和 令人沮丧。如果您正在使用 .charAt(pos)函数,您不会尝试去做 。

基本上,这是一种在所有浏览器中都没有完全实现的捷径。

请注意,您无法使用任一种方法编写字符。但是,该功能在使用.charAt()函数时更易于理解,在大多数语言中该函数是只读函数。

+6

的确,这个记法在IE7中不起作用,但是这不是现在的巨大缺点。与此同时,我所做的基准测试显示,在字符串装入对象时,在Chrome中使用charAt与indexer时性能下降了三倍。我知道这不是真的相关,但仍值得注意.https://jsfiddle.net/mdasxxd2/ – 2016-07-25 10:51:54

+4

更准确的测试(benchmark.js)https://esbench.com/bench/579609a0db965b9a00965b9e – NoNameProvided 2016-07-25 12:46:08

69

MDN

有一个字符串中访问一个个性的两种方式。第一个是charAt方法:

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

另一种方法是治疗所述字符串作为数组,其中每个索引对应于一个单独的字符:

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

的第二种方法(处理字符串作为数组)不是ECMAScript 3的一部分;这是一个JavaScript和ECMAScript 5功能(并且在所有浏览器中都不支持)。

在这两种情况下,尝试设置单个字符都不起作用。试图通过charA设置一个字符会导致错误,当试图通过索引来设置字符时不会抛出错误,但字符串本身并未改变。

因此,正如您现在可能已经发现的那样,从兼容性角度来看,charAt()更好。

+10

确实,ECMA 5不是但支持所有浏览器,但它在MOST浏览器上受支持:意味着IE9及更高版本和所有Chrome/Firefox版本: http://kangax.github.io/compat-table/es5/#Property_access_on_strings 没有JS功能将永远得到100%的支持,我觉得避免使用ECMA 5功能将使我们永远在过去...... – 2015-02-11 13:20:53

10

String.charAt()是标准的,它适用于所有浏览器。 在非IE浏览器中,您可以使用括号表示来访问字符,但IE不支持。 (不知道他们是否已经实施了最新版本)。

如果有人真的想使用支架通知。将字符串转换为char数组是明智的选择,以便与任何浏览器兼容。

var testString = "Hello"; 
var charArr = myString.split(''); 
+5

IE支持从8开始的括号表示法。 – mrec 2014-01-02 15:33:18

+3

处理Unicode时,此方法会中断:http://mathiasbynens.be/notes/javascript-unicode – 2014-04-07 17:41:30

+0

该方法在处理真正大的字符串时效率不高,因为它会复制内存中的数据(原始字符串和数组) 。 – Daniel 2015-11-12 04:14:43

54

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

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

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

的功能的charAt取决于索引如何转换为一个数字在spec

+0

''hello'[undefined] // undefined'和''hello'.charAt(undefined)// h' – 2016-02-25 20:58:29

+2

'null'就像'undefined'一样工作,但是看到这个:''hello“[”00“] //“undefined”,但是“hello”.charAt(“00”)//“h”'和“”hello“[”0“] //”h“' – panzi 2016-02-27 19:42:43

+3

这一直说服我继续使用'[' 。 – ApproachingDarknessFish 2017-06-06 15:44:30