Javascript中的str.charAt(5)与str[5]

Javascript中的str.charAt(5)与str[5],javascript,performance,Javascript,Performance,显然,为什么str[3]版本要慢得多 var str = 'Hello'; str.charAt(3); str[3]; 编辑:对我来说,str[3]在Chrome 28.0.1500.71 Ubuntu 13.04上的速度要慢80%稍微调整一下基准: 不要使用常数,也不要使用像这样的操作代码,因为它很容易被消除,然后你就不能测量你认为你正在测量的东西 下一步考虑,即使我们有无限智能JIT,这些操作也有不同的语义: 调用charAt越界时会发生什么?只需返回空字符串 调用[]越界时会发生什

显然,为什么
str[3]
版本要慢得多

var str = 'Hello';

str.charAt(3);
str[3];


编辑:对我来说,
str[3]
Chrome 28.0.1500.71 Ubuntu 13.04上的速度要慢80%

稍微调整一下基准:

不要使用常数,也不要使用像这样的操作代码,因为它很容易被消除,然后你就不能测量你认为你正在测量的东西

下一步考虑,即使我们有无限智能JIT,这些操作也有不同的语义:

调用
charAt
越界时会发生什么?只需返回空字符串

调用
[]
越界时会发生什么情况?从字符串到对象遍历原型链,最终未找到时返回
undefined

String.prototype[3] = "hi";
var string = "asd";
string.charAt(3); //""
string[3]; //"hi"

的确,当所有读取都在范围内时,它可以执行相同的操作。

取决于浏览器和操作系统,我在Ubuntu.com上的Chrome浏览器中获得了
str[3]
最快的10%。MacStr[3]上的Chrome与Firefox 24.0相比慢了35%,我得到的结果几乎相同。显然,这取决于浏览器。我不知道在一个选项执行速度比另一个慢的机器上这是否是缓存问题。@elclanrs:我不知道Chrome是否如此之快,测量结果是否毫无意义,因为我也在使用Chrome/Ubuntu(虽然是一个过时的版本)。我也这么认为,这些测试的问题是,除非你测试一些有用的东西,否则它们无法显示准确的结果。