本来我的解法:
function reverse(s1){
var s2 = [];
for(var i = s1.length - 1;i>=0;i--)
{
s2.push(s1.charAt(i));
}
s2 = s2.join("");
return s2;
}
因为用了数组push方法,感觉效率不会高...
下面两种效率高点的:
function reverse(s1){
var s2 = "";
s2 = s1.split('').reverse().join('');
return s2;
}
function reverse(s1){
var s2 = "";
for (var i = s1.length ; i >= 0 ; --i)
{
s2+=s1.charAt(i);
}
return s2;
}
有人总结了:
其中String.js中是 var s1 = "很长的字符串"; 测试一下结果发现Chrome,FireFox,IE8下的结果都不同。 而且悲剧的发现我那种的效率是最差的无论是在哪种浏览器下,其中Chrome最好的是第二种,Firefox跟IE最好的是第一种。 让我们来探讨一下原因: 其实很大部分的性能都取决于字符串的拼接,之前看了篇提高 web 应用性能之 JavaScript 性能调优,发现新的浏览器对“+=”做了优化,性能略快于数组的“join”方法。所以为什么第二种方法+=会比第一种快的原因就很好解释了。 第二:原生函数肯定比我们自己写的函数快速,数组反转这块我没去研究过,看了下ECMAScript和V8引擎...
发现内部是这么实现的,交换首尾两个元素的位置,直到中间。 如果自己实现的话,并不能访问Object的一些Set,Put操作,加大了难度。 还需要注意一点的是如果操作字符编码是Utf-8的中文字符的话,转换结果是不正确的,JavaScript尚不能很好的支持Utf-8的中文字符。所以比较好的方法是将字符串转换成GBK或者GB18030。他也把时间复杂度由O(n)的改成O(n/2):代码如下:
String.prototype.reverse = function(){
var len = this.length,
middle = Math.floor(len/2),
tmp1 = '',
tmp2 = '',
upper = len-1,
lower = middle,
isEven = len % 2;
while(middle){
!isEven && (lower == 1)?null:tmp1 += this.charAt(upper);
tmp2 += this.charAt(lower);
--lower;
--upper;
--middle;
}
tmp2 += this.charAt(0);
return tmp1+=tmp2;
}
ps:外国有篇文章提到这个:http://www.shamasis.net/2009/09/javascript-string-reversing-algorithm-performance/