zoukankan      html  css  js  c++  java
  • javascript中字符串拼接详解

    字符串拼接是所有程序设计语言都需要的操作。当拼接结果较长时,如何保证效率就成为一个很重要的问题。本文介绍的是Javascript中的字符串拼接,希望对你有帮助,一起来看。
     

    最近在研究《javascript高级程序设计》中,有一段关于字符串特点的描述,原文大概如下:ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能改变。要改变某个变量的保存的的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充该变量,例如:

     
    var lang = "Java";
    lang = lang + "Script";

     实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后一步是销毁原来的字符串“Java”和“Script”,因为这两个字符串已经没用了。但是在低版本的浏览器(如IE6)中,字符串拼接速度是很消耗一个性能的过程。

    由此我就联想到了Java,在Java中的字符串机制也和js差不多(即创建了就不能改变,要改变只能销毁原来的值),但是Java有个StringBuffer解决了字符串不可变的问题,js且没有类似的方法。但是我们可以模拟这种缓冲机制。其原理是利用数组进行拼接,源代码如下:

     

    function StringBuffer() {
        this.__strings__ = new Array();
    }
    StringBuffer.prototype.append = function (str) {
        this.__strings__.push(str);
        return this;    //方便链式操作
    }
    StringBuffer.prototype.toString = function () {
        return this.__strings__.join("");
    }

    /*测试*/
    var buffer = new StringBuffer();
    buffer.append("Hello ").append("javascript");
    
    var result = buffer.toString();
    alert(result); 

     ps:gist地址如下:https://gist.github.com/hehongwei44/fe71f10e4d2d9295aeab

    机制我们模拟出来了,但是这个方法和字符串拼接性能上有多少差别了,我们可以测试一下,测试代码如下:


    var d1 = new Date();
    var str = "";
    for(var i = 0; i < 10000; i++){
        str += "text ";
    }
    var d2 = new Date();
    document.write("测试一花费: " + (d2.getTime() - d1.getTime())/1000 + "秒"+"<br/>");
     
    
    var oBuffer = new StringBuffer();
    d3 = new Date();
    for(var i = 0; i < 10000; i++){
        oBuffer.append("text ");
    }
    var sResult = oBuffer.toString();
    d4 = new Date();
    document.write("测试二花费: " + (d4.getTime() - d3.getTime())/1000 + "秒");

     测试结果如下:(环境不同,测试结果可能不同):

    1 在以1000次为基数的情况下,进行比较,两者执行都非常快(基本都是几毫秒)耗时都差不多,后者以前者相差不会超过10个毫秒。
    2 在以10000次为基数的情况下,执行结果和上面差不多,但是前者在IE6下话费的事件较多。
    3 在以100000次为基数的情况下,字符串拼接在IE6下,明显花的时间更多,其他浏览器相差不大,有的反而比StringBuffer更短。

    结论

    1 在拼接词数少于1000次的情况下,大胆的使用前者,一般我们也很少碰到拼接次数上千的情况。
    2 其他浏览器对于拼接都没什么性能问题,主要是IE6,如果拼接次数上万或者十万的话,建议单独对IE6是用StringBuffer模拟。
  • 相关阅读:
    JavaScript测试工具chai
    gradle初始仓库依赖(含junit)
    汇编和中断
    oracle-12c-ee安装
    pickle
    Python (zip, lambda, map, shallow copy, deepcopy)
    豆瓣源下载tensorflow
    Linux上XRDP可作为WIN的远程连接
    VNC连接远程Linux——废弃电脑作为运算机器
    MACOS 运行Keras报错
  • 原文地址:https://www.cnblogs.com/printN/p/6744648.html
Copyright © 2011-2022 走看看