问题:字符串连接操作为何如此缓慢?
我们先来看下面这段代码:

var str = 'abc';
str += 'def';

在这段代码背后系统做了如下工作:
        1.为'abc'分配相应大小的内存区域并存入;
        2.为'def'分配相应大小的内存区域并存入;
        3.为'abcdef'分配相应大小的内存区域,并分别将'abc'及'def'从各自的内存区域复制到新的内存区域。

看出来没有,问题的根源就在于存储字符串的内存区域不能随意的改变大小。这样每次进行字符串连接时,必须首先为结果字符串分配存储区域,然后再将各子串从各自的内存区域复制到新的内存区域,这样的繁复操作无疑会带来严重的性能问题。

基本思路
        其实很简单,就是利用Array的push()方法,将字符串中的所有子串放入一个Array中,最后通过join()方法得到最终字符串。

方法1-传统方式(执行时间:172ms)

var str = "";
for (var i = 0; i < 10000; i++) {
    str += "abc";
}

方法2-Array方式(执行时间:62ms)

var str = "";
var arr = new Array();
for (var i = 0; i < 10000; i++) {
    arr.push("abc");
}
str = arr.join('');

可以看出,第二种方法的代码执行效率有了较大提高,仔细分析就会发现,方法2较之方法1,减少了内存分配步骤,因此性能得到了较大提升。
(注:代码执行时间均来自笔者的测试环境,视具体情况可能会有所不同。)

完整代码
1.定义StringBuilder类

//构造函数
function StringBuilder() {
    this._strings = new Array();
}

//append方法定义
StringBuilder.prototype.append = function (str) {
    this._strings.push(str);
}

//toString方法定义
StringBuilder.prototype.toString = function () {
    return this._strings.join('');
}

2.使用StringBuilder类

var sb = new StringBuilder(); //创建StringBuilder类的实例
sb.append('abc');
sb.append('def');
alert(sb.toString()); //输出'abcdef'

总结
      本文通过运用JavaScript中的面向对象功能模拟了.net中的StringBuilder,为了优化字符串连接性能,采用了Array方式进行操作。

转载于:https://www.cnblogs.com/Kenny-Jiang/archive/2007/08/24/868778.html

JavaScript中实现类似StringBuilder的功能相关推荐

  1. sql server 数组_如何在SQL Server中实现类似数组的功能

    sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...

  2. .net里面实现javascript中的 escape 和 unescape 功能

    javascript 脚本,有个 escape 和 unescape ,在做URL传递等的情况下, 用的比较多 到了.NET里面, 在 C# 和 VB.NET 下, 仍然有很多人想使用这种功能, 但是 ...

  3. javascript中几个有意思的功能(目前5项) 1右键无效 2禁止网页复制 3禁止F5刷新 4新发现 5屏蔽js错误

    1.右键无效 <script> document.οncοntextmenu=new Function("event.returnValue=false;"); < ...

  4. flutter中 实现类似Android OnResume功能

    在Android中 页面从栈里面回到前台显示 有固定的生命周期方法 onReume(),虽然在flutter也有widget生命周期方法,但是功能和onResume()方法相差比较大,并不能监听路由栈 ...

  5. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  6. javascript中的闭包closure详解

    文章目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一 ...

  7. JavaScript 中的函数式编程:函数,组合和柯里化

    作者:Fernando Doglio 译者:前端小智 来源:medium 移动端阅读:点这里 点赞再看,微信搜索 [大迁世界] 关注这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub ht ...

  8. javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码

    javascript编写 by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用解构来编写更简洁,功能更强大的代码 (How to ...

  9. 帮助你更好理解javascript中easing功能的网站 - Easings.net

    日期:2012-10-17  来源:GBin1.com 如果你开发过jQuery的动画效果的话,肯定接触过一个jQuery插件:jquery.easing plugin,这个插件可以帮助你生成不同类型 ...

最新文章

  1. 彻底解决web开发中遇到的路径问题(上)
  2. DedeCms如何调用Discuz论坛主题等数据方法总结
  3. CentOS 5.5升级网卡驱动
  4. 这几个技巧让你做出让导师眼前一亮的答辩 PPT
  5. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
  6. 知道这些性能优化手段,工资起码提升一倍
  7. php基本函数对象,PHP常用函数对象_PHP教程
  8. python导入类属性不存在_为什么我会得到一个错误:我的类中不存在该属性?
  9. 中文字符频率统计python_使用 Python 统计中文字符的数量
  10. HIBTC谈比特币交易平台安全架构
  11. 《程序是怎样跑起来的》第七章
  12. alpha对冲(股票+期货)——Python量化
  13. Double计算精度丢失(金融入门知识点)
  14. php户型图识别,5分钟教你马上看懂户型图
  15. 面对恐惧和压力,你是怎么做的?
  16. 此CA证书不受信任的解决办法
  17. 微信小程序中的vw和vh单位
  18. 2020.03.18模拟赛17(第二题)
  19. 计算机网络笔记(3) 网络应用P2P架构
  20. SQL Server 创建update、delete触发器实例

热门文章

  1. lower_bound()和upper_bound()
  2. flash 火狐总是崩溃_win10系统火狐flash插件总是崩溃的解决方法
  3. 湖北职称计算机考试报名时间2016,湖北2016年下半年职称计算机考试报名时间延长通知...
  4. java .net 3des_Java.net3DES差异及互通
  5. Java 获取链表的元素
  6. Java 在链表的开头和结尾添加元素
  7. Java多对多关系示例
  8. 【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)
  9. php+分针和时针重合,时钟问题—两针重合
  10. A4.2021年全国数学建模竞赛A题-赛题分析与评阅要点(FAST主动反射面的形状调节)