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 相关文章推荐
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
js特殊字符转义介绍
Nov 05 Javascript
node.js中的fs.readFile方法使用说明
Dec 15 Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 Javascript
jQuery移动web开发中的页面初始化与加载事件
Dec 03 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
AngularJS中的按需加载ocLazyLoad示例
Jan 11 Javascript
用js简单提供增删改查接口
May 12 Javascript
微信小程序select下拉框实现效果
May 15 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 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学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
header导出Excel应用示例
2014/01/24 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
扩展String功能方法
2006/09/22 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python输入错误后删除的方法
2019/10/12 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
会计电算化个人自我评价
2013/11/17 职场文书
早读课迟到检讨书
2014/09/25 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android