javascript中字符串拼接详解


Posted in Javascript onSeptember 26, 2014

最近在研究《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 相关文章推荐
JavaScript是否可实现多线程  深入理解JavaScript定时机制
Dec 22 Javascript
ExtJs使用总结(非常详细)
Mar 22 Javascript
jQuery功能函数详解
Feb 01 Javascript
JavaScript更改字符串的大小写
May 07 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
Oct 21 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 Javascript
vue父组件给子组件的组件传值provide inject的方法
Oct 23 Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 Javascript
JavaScript拆分字符串时产生空字符的解决方案
Sep 26 #Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 #Javascript
前端轻量级MVC框架CanJS详解
Sep 26 #Javascript
alert出数组中的随即值代码
Sep 25 #Javascript
jquery得到iframe src属性值的方法
Sep 25 #Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 #Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 #Javascript
You might like
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
五段实用的js高级技巧
2011/12/20 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
python登录豆瓣并发帖的方法
2015/07/08 Python
Python 的内置字符串方法小结
2016/03/15 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python小白垃圾回收机制入门
2020/06/09 Python
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
《童趣》教学反思
2014/02/19 职场文书
小学生家长寄语
2014/04/02 职场文书
献爱心倡议书
2014/04/14 职场文书
党员转正大会主持词
2015/07/02 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript