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常用技巧及常用方法列表集合
Apr 06 Javascript
jQuery表格行换色的三种实现方法
Jun 27 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
Javascript获取HTML静态页面参数传递值示例
Aug 18 Javascript
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
JS使用cookie实现只出现一次的广告代码效果
Apr 22 Javascript
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
Nov 07 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
Yii使用技巧大汇总
2015/12/29 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
JS小功能(checkbox实现全选和全取消)实例代码
2013/11/28 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
jquery图片切换插件
2015/03/16 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
vue-loader教程介绍
2017/06/14 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
python自动安装pip
2014/04/24 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
Python 探针的实现原理
2016/04/23 Python
Django model反向关联名称的方法
2018/12/15 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
python变量的作用域是什么
2020/05/26 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
详解python变量与数据类型
2020/08/25 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
网络安全类面试题
2015/08/01 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
签订劳动合同通知书
2015/04/16 职场文书