js--字符串reverse

本来我的解法:
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/

转载于:https://my.oschina.net/lgmcolin/blog/120701

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值