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的单例模式 (singleton in Javascript)
Jun 11 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 Javascript
JS中对Cookie的操作详解
Aug 05 Javascript
简单谈谈Javascript函数中的arguments
Feb 09 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
javascript实现评分功能
Jun 24 Javascript
在Vue中获取自定义属性方法:data-id的实例
Sep 09 Javascript
原生js中运算符及流程控制示例详解
Jan 05 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学习资源和链接.
2006/12/05 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
详解flask表单提交的两种方式
2018/07/21 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
总经理秘书的岗位职责
2013/12/27 职场文书
电气工程师岗位职责
2014/01/01 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
委托书样本
2014/04/02 职场文书
关于旅游的活动方案
2014/08/15 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书