是否有任何理由我应该使用string.charAt(x)
而不是括号记号string[x]
?string.charAt(x)或string [x]?
回答
// Bracket Notation
"Test String1"[6]
// Real Implementation
"Test String1".charAt(6)
这是一个坏主意,用括号内,这些原因(Source):
这种表示法并不在IE7工作。 第一个代码片段将返回在IE7中未定义的 。如果你碰巧使用 字符串所有 在你的代码中的括号标记,并要迁移 到
.charAt(pos)
,这是一个真正的痛苦: 支架都是用在你的代码 ,有没有简单的方法,如果 这是检测对于一个字符串或一个 数组/对象。您不能使用此表示法设置字符。由于 没有任何警告,这是令人困惑和 令人沮丧。如果您正在使用
.charAt(pos)
函数,您不会尝试去做 。
基本上,这是一种在所有浏览器中都没有完全实现的捷径。
请注意,您无法使用任一种方法编写字符。但是,该功能在使用.charAt()
函数时更易于理解,在大多数语言中该函数是只读函数。
从MDN:
有一个字符串中访问一个个性的两种方式。第一个是
charAt
方法:return 'cat'.charAt(1); // returns "a"
另一种方法是治疗所述字符串作为数组,其中每个索引对应于一个单独的字符:
return 'cat'[1]; // returns "a"
的第二种方法(处理字符串作为数组)不是ECMAScript 3的一部分;这是一个JavaScript和ECMAScript 5功能(并且在所有浏览器中都不支持)。
在这两种情况下,尝试设置单个字符都不起作用。试图通过charA设置一个字符会导致错误,当试图通过索引来设置字符时不会抛出错误,但字符串本身并未改变。
因此,正如您现在可能已经发现的那样,从兼容性角度来看,charAt()
更好。
确实,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
String.charAt()是标准的,它适用于所有浏览器。 在非IE浏览器中,您可以使用括号表示来访问字符,但IE不支持。 (不知道他们是否已经实施了最新版本)。
如果有人真的想使用支架通知。将字符串转换为char数组是明智的选择,以便与任何浏览器兼容。
var testString = "Hello";
var charArr = myString.split('');
非常有趣的结果,当你测试的字符串索引访问VS的charAt()
方法。似乎Chrome是唯一一款喜欢charAt
以上的浏览器。
他们可以给在边缘情况不同的结果。
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
的功能的charAt取决于索引如何转换为一个数字在spec。
''hello'[undefined] // undefined'和''hello'.charAt(undefined)// h' – 2016-02-25 20:58:29
'null'就像'undefined'一样工作,但是看到这个:''hello“[”00“] //“undefined”,但是“hello”.charAt(“00”)//“h”'和“”hello“[”0“] //”h“' – panzi 2016-02-27 19:42:43
这一直说服我继续使用'[' 。 – ApproachingDarknessFish 2017-06-06 15:44:30
- 1. XName x =“string”?
- 2. Flot With“String”x-axis
- 3. Python 3.X或Python 2.X
- 4. Datamapper 0.9.x或0.10.x?
- 5. CSng()或x 1F?
- 6. R:f(x)!= sapply(x,f) - 缺陷或特征?
- 7. Cassandra从2.0.x升级到2.1.x或3.0.x
- 8. -E或-x当输入来自标准输入时需要-x或-x
- 9. Prolog X = f(X)。 (X)
- 10. Casper.js WaitFor X或Y
- 11. Hibernate 2.1.6或3.x?
- 12. split()loop:if string number = x,insert <br>
- 13. 从#定义SQR(X)(X * X)
- 14. 什么是泛型语法的名称:“X. <String,String> method()”
- 15. Parallel.ForEach x of x
- 16. Ruby:%{x}与#{x}?
- 17. 中x = GCC(X ++)
- 18. 在X中X
- 19. 将Realm 2.x对象列表迁移到Realm 3.x String(或其他主类型)列表
- 20. 为什么变量初始化到赋值表达式[String x =(x = y)]编译?
- 21. php curl -k或--insecure,-X
- 22. iOS onTouchMove x或y轴
- 23. 如何从String.charAt解析Int()
- 24. Java:Calc x in sin(x)
- 25. X键的X键
- 26. 批量更新与IN(x,x,x)
- 27. x * x vs Math.pow(x,2)java performance
- 28. PHP循环内循环x x后x
- 29. X =东西(X)的东西(X)
- 30. 将x => array.Contains(x)表达式转换为x => x == 1 || X == 2
的确,这个记法在IE7中不起作用,但是这不是现在的巨大缺点。与此同时,我所做的基准测试显示,在字符串装入对象时,在Chrome中使用charAt与indexer时性能下降了三倍。我知道这不是真的相关,但仍值得注意.https://jsfiddle.net/mdasxxd2/ – 2016-07-25 10:51:54
更准确的测试(benchmark.js)https://esbench.com/bench/579609a0db965b9a00965b9e – NoNameProvided 2016-07-25 12:46:08