javascript性能优化(5)

字符串和正则表达式

    str="a"+"b"+"c"; //low

    str="a";
    str+='b';
    str+='c';//faster等同于 str=str+'a'+'b'+'c';

数组字符串方法

    str=['a','b','c'].join("");//数组

    str='a';//字符串
    str=str.concat('b','c');
数组链接join

在大多数浏览器上使用数组链接join要比 链接字符串的其他的方法更慢。
测试一个5000次的字符串拼接

//low
    var str="I,m a super man",
        newstr="",
        strs=[],
        appends=5000;
    while (appends--){
        newstr+=str;
    }
    console.log(newstr);

和join结合

//faster
    var str="I,m a super man",
        newstr="",
        strs=[],
        appends=5000;
    while (appends--){
        strs[strs.length]=str;
    }
    newstr=strs.join("");
    console.log(newstr);
字符串链接concat

优点是接收任意数目的字符串;但是多数情况下他要比+和+=慢一些。

    str=str.concat(s1);
    str=str.concat(s1,s2,s3);
    str=String.prototype.concat.apply(str,array);//和数组拼接
正则

以下是基于正则表达式的修剪实例,去除左右两个空格

//trim1
     String.prototype.trim=function () {
        return  this.replace(/^\s+|\s+$/g,"");
    }

通过分支功能合并了两个简单的正则表达式,并使用全局/g标记替换所有匹配,而不只是第一个(当目标字符串首尾都有空格时它将匹配两次)。但是对长字符串操作时,它比使用两个简单的字表达式要慢,因为两个分支选项都要测试每个字符的位置。

//trim2
    String.prototype.trim=function () {
        return  this.replace(/^\s*([\s\S]*?)\s*$/,"$1");
    }

匹配整个字符串,捕获从第一个到最后一个非空格字符之间的序列,记入后向引入1,然后使用后向引入1替代整个字符串,就留下了这个字符串的修剪版本。

混合解决方案

用正则表达式修剪头部表格,用非正则表达式修剪尾部字符。

String.prototype.trim=function () {
        var str=this.replace(/^s+/,""),
            end=str.length-1,
            ws=/|s/;
        while (ws.test(str.charAt(end))){
            end--;
        }
        return  str.slice(0,end+1);
    }

总结

  • 数组链接是链接字符串比较慢的方法之一。使用简单的+/+=,可以避免产生不必要的中间字符串。
  • 当链接数量巨大或链接尺寸巨大的字符串时,数组链接是一个比较好的方法。
  • 回溯既是正则表达式匹配功能的基本的组成部分,又是正则表达式影响效率的常见原因。
  • 回溯失控发生在正则表达式本应很快发现匹配的地方,因为某些特殊的匹配字符串动作,导致运行缓慢,甚至浏览器崩溃。避免此问题的技术包括:使邻近字元互斥,避免嵌套量词对一个字符串的相同部分多次匹配,通过重复利用前瞻操作的原子特性去除不必要的回溯。
  • 虽然有很多方法来修正一个字符串,使用两个简单的正则表达式(一个用于去除头部空格,另一个用于去除尾部空格)提供了一个简洁、跨浏览器的方法,适用于不同内容长度的字符串。从字符串末尾开始循环查找第一个非空格字符,或者在一个混合应用中将此技术与正则表达式结合起来,提供了一个很好的替代方案,它很少受到字符串整体长度影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值