JavaScript中实现类似StringBuilder的功能
问题:字符串连接操作为何如此缓慢?
我们先来看下面这段代码:
str += 'def';
在这段代码背后系统做了如下工作:
1.为'abc'分配相应大小的内存区域并存入;
2.为'def'分配相应大小的内存区域并存入;
3.为'abcdef'分配相应大小的内存区域,并分别将'abc'及'def'从各自的内存区域复制到新的内存区域。
看出来没有,问题的根源就在于存储字符串的内存区域不能随意的改变大小。这样每次进行字符串连接时,必须首先为结果字符串分配存储区域,然后再将各子串从各自的内存区域复制到新的内存区域,这样的繁复操作无疑会带来严重的性能问题。
基本思路
其实很简单,就是利用Array的push()方法,将字符串中的所有子串放入一个Array中,最后通过join()方法得到最终字符串。
方法1-传统方式(执行时间:172ms)
for (var i = 0; i < 10000; i++) {
str += "abc";
}
方法2-Array方式(执行时间:62ms)
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类
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的功能相关推荐
- sql server 数组_如何在SQL Server中实现类似数组的功能
sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...
- .net里面实现javascript中的 escape 和 unescape 功能
javascript 脚本,有个 escape 和 unescape ,在做URL传递等的情况下, 用的比较多 到了.NET里面, 在 C# 和 VB.NET 下, 仍然有很多人想使用这种功能, 但是 ...
- javascript中几个有意思的功能(目前5项) 1右键无效 2禁止网页复制 3禁止F5刷新 4新发现 5屏蔽js错误
1.右键无效 <script> document.οncοntextmenu=new Function("event.returnValue=false;"); < ...
- flutter中 实现类似Android OnResume功能
在Android中 页面从栈里面回到前台显示 有固定的生命周期方法 onReume(),虽然在flutter也有widget生命周期方法,但是功能和onResume()方法相差比较大,并不能监听路由栈 ...
- Javascript中的函数重载-最佳做法
用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...
- javascript中的闭包closure详解
文章目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一 ...
- JavaScript 中的函数式编程:函数,组合和柯里化
作者:Fernando Doglio 译者:前端小智 来源:medium 移动端阅读:点这里 点赞再看,微信搜索 [大迁世界] 关注这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub ht ...
- javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码
javascript编写 by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用解构来编写更简洁,功能更强大的代码 (How to ...
- 帮助你更好理解javascript中easing功能的网站 - Easings.net
日期:2012-10-17 来源:GBin1.com 如果你开发过jQuery的动画效果的话,肯定接触过一个jQuery插件:jquery.easing plugin,这个插件可以帮助你生成不同类型 ...
最新文章
- 彻底解决web开发中遇到的路径问题(上)
- DedeCms如何调用Discuz论坛主题等数据方法总结
- CentOS 5.5升级网卡驱动
- 这几个技巧让你做出让导师眼前一亮的答辩 PPT
- 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
- 知道这些性能优化手段,工资起码提升一倍
- php基本函数对象,PHP常用函数对象_PHP教程
- python导入类属性不存在_为什么我会得到一个错误:我的类中不存在该属性?
- 中文字符频率统计python_使用 Python 统计中文字符的数量
- HIBTC谈比特币交易平台安全架构
- 《程序是怎样跑起来的》第七章
- alpha对冲(股票+期货)——Python量化
- Double计算精度丢失(金融入门知识点)
- php户型图识别,5分钟教你马上看懂户型图
- 面对恐惧和压力,你是怎么做的?
- 此CA证书不受信任的解决办法
- 微信小程序中的vw和vh单位
- 2020.03.18模拟赛17(第二题)
- 计算机网络笔记(3) 网络应用P2P架构
- SQL Server 创建update、delete触发器实例
热门文章
- lower_bound()和upper_bound()
- flash 火狐总是崩溃_win10系统火狐flash插件总是崩溃的解决方法
- 湖北职称计算机考试报名时间2016,湖北2016年下半年职称计算机考试报名时间延长通知...
- java .net 3des_Java.net3DES差异及互通
- Java 获取链表的元素
- Java 在链表的开头和结尾添加元素
- Java多对多关系示例
- 【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)
- php+分针和时针重合,时钟问题—两针重合
- A4.2021年全国数学建模竞赛A题-赛题分析与评阅要点(FAST主动反射面的形状调节)