字符串拼接是所有程序设计语言都需要的操作。当拼接结果较长时,如何保证效率就成为一个很重要的问题。C 语言的 strcat 函数直接操作内存,效率自然最高;C++ 的 string 类是可变的,本质上也是直接操作内存,效率也不在话下;Java 的 String 类不可变,字符串拼接意味着产生新对象,因此提供了专门用于字符串拼接的 StringBuffer 类,也保证了执行效率。

在 Javascript 中,大规模的字符串拼接虽不常见,但也并非没有。在这种情况下,传统的字符串拼接会比较慢:

<script>        
    function strcat1(count, substr) //将 count 个 substr 拼接在一起
    {
        var result = "";
        for (var i = 0; i < count; ++i)
        {
            result += substr;
        }
        return result;
    }

var begin = new Date();
    strcat1(10000, "substr");    
    var end = new Date();
    alert(end.valueOf() - begin.valueOf());
</script>
    在笔者的机器上(下同)这段代码要执行 3 秒钟。有没有比较快的拼接方法?答案是肯定的,Javascript 也提供了一个类似 StringBuffer 的东西,那就是数组:

<script>        
    function strcat2(count, substr)
    {
        var buffer = [];
        for (var i = 0; i < count; ++i)
        {
            buffer.push(substr);
        }
        return buffer.join("");
    }

var begin = new Date();
    strcat2(10000, "substr");    
    var end = new Date();
    alert(end.valueOf() - begin.valueOf());
</script>
    这段代码只需执行 80 毫秒左右,比传统的字符串拼接快了数十倍。这是针对大规模的字符串拼接而言。对于小规模的字符串拼接,我们可以比较一下两种拼接方法的效率:

<script>
    function strcat1(count, substr)
    {
        var result = "";
        for (var i = 0; i < count; ++i)
        {
            result += substr;
        }
        return result;
    }

function strcat2(count, substr)
    {
        var buffer = [];
        for (var i = 0; i < count; ++i)
        {
            buffer.push(substr);
        }
        return buffer.join("");
    }

function test(strcat)
    {
        var substr = "substr";
        var begin = new Date();
        for (var i = 0; i < 1000; ++i)
        {
            strcat(10, substr);
        }
        var end = new Date();
        return end.valueOf() - begin.valueOf();
    }

alert(test(strcat1) + "," + test(strcat2));
</script>
    这一轮是传统的拼接方式胜出,其速度大约是数组方式的两倍多。可以验证,拼接的次数越少,传统的拼接方式优势越大。因此,在大规模的拼接中,如果混用传统拼接方法和数组拼接方法,速度会更快:

<script>        
    function strcat3(count, substr)
    {
        var buffer = [];
        count /= 5;
        for (var i = 0; i < count; ++i)
        {
            buffer.push(substr + substr + substr + substr + substr);
        }
        return buffer.join("");
    }

var begin = new Date();
    strcat3(10000, "substr");    
    var end = new Date();
    alert(end.valueOf() - begin.valueOf());
</script>
    这次只需执行 30 毫秒了。因此,笔者推荐以数组方式为主,适当辅以传统方式来拼接长字符串。下面是一个实例:

<script>        
    function doLoad()
    {
        var buffer = ["<table style='width:100%' border=1>"];
        for (var i = 0; i < 100; ++i)
        {
            buffer.push("<tr>");
            for (var j = 0; j < 20; ++j)
            {
                buffer.push("<td>" + i + "," + j + "</td>");
            }
            buffer.push("</tr>");
        }
        buffer.push("</table>");
        document.body.innerHTML = buffer.join("");
    }
</script>
<body οnlοad="doLoad()"></body>
说明:
    1、传统方式与数组方式会有以上差别的原因在于:传统方式拼接 n 个字符串的时间复杂度为 O(n^2),但系数较小;数组方式的时间复杂度为 O(n),但系数较大。
    2、以上代码在 IE6 中调试通过。

转载于:https://blog.51cto.com/firebirds/821835

Javascript 中的长字符串拼接相关推荐

  1. 为什么阿里巴巴不建议在for循环中使用+进行字符串拼接

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 字符串,是Java中最常用的一个数据类型了.关于字符串的知识,作者 ...

  2. 为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文,也是对于Java中字符串相关知识的一个补充,主要来介绍一下字 ...

  3. java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较

    [Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...

  4. JavaScript中常见的字符串操作函数及用法汇总

    转载地址:http://www.jb51.net/article/65358.htm 这篇文章主要介绍了JavaScript中常见的字符串操作函数及用法,实例汇总了javascript常见的字符串转换 ...

  5. JavaScript 中的长整型精度问题

    JavaScript 在处理长整型时会有一定的问题,有时精度会缺失. 问题 当 Java 后台有个 Long 型值20175678901234567转到前台时,发现精度存在问题: var batchN ...

  6. java两字符串是否相等_Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  7. js中定义用字符串拼接起来的变量名的变量

    转载:https://www.cnblogs.com/vlone/p/4602072.html js中定义用字符串拼接起来的变量名的变量 今天在写js的时候碰到了难题,我又一个页面需要生成很多的变量. ...

  8. 在JavaScript中解析查询字符串[重复]

    本文翻译自:Parse query string in JavaScript [duplicate] Possible Duplicate: 可能重复: How can I get query str ...

  9. android string拼接字符串_为什么阿里巴巴不建议在循环体中使用+进行字符串拼接?...

    之前在阅读<阿里巴巴Java开发手册>时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符 ...

最新文章

  1. 最近最近在微软的Mobile Soft factory
  2. 故障发生前为什么敏捷团队的成功?
  3. 一致的数据访问技术ADO/OLE DB
  4. mysql字符乱码_MySQL字符乱码解决方案
  5. .CN域名总量达1090.6万个:8月份共净增13.8万个
  6. PURE DORM IS GREAT
  7. SecureCRT中的实用配置
  8. [剑指offer]面试题48:不能被继承的类
  9. 使用el-checkbox实现全选,点击失效没有反应
  10. 程序员自救指南:一不小心删库删表怎么办?
  11. 香港中文大学(深圳)张大鹏教授项目组招聘PhD
  12. Golang原生sql操作Mysql数据库增删改查
  13. SAP License:SAP集成(后面为粘贴)
  14. 手机访问www如何自动跳转到m js代码实现
  15. 运行时的相互联系(PE、Windows 加载器、应用程序域、程序集清单、元数据、类型、对象、线程栈、托管堆)...
  16. 笹山希 java,C#版数据结构与算法高级教程(深入探讨)--附各种算法实例-升级版
  17. 数据结构 笔记--向量 C++ 语言版 邓俊辉老师
  18. MFC获取主机IP地址
  19. 关于cv2.cvtColor函数的一些小小的思考
  20. 想当站长请立即使用Orchard

热门文章

  1. jpa SessionFactory事物失效
  2. 【java 性能优化实战】4 工具实践:基准测试 JMH,精确测量方法性能
  3. c mysql 分页,MySQL查询之排序分页
  4. php获取服务器文件路径,php获取服务器路径
  5. linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹
  6. by截取字段 group_sqlserver group by后获取其他字段(多种方法)
  7. nginx http转https_Nginx处理访问www域名跳转到不带www域名的配置方法
  8. api可以主动采集用户数据吗_数据埋点采集的那些事儿
  9. python提取excel中的某几列数据-python-将excel中的某些列读取到数据框
  10. 我国第一台微型计算机诞生于哪一年,2015计算机一级《MSOffice》章节练习题及答案(1)...