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数组的排序 sort()方法和reverse()方法
Jun 04 Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
Java File类的常用方法总结
Mar 18 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
jQuery内存泄露解决办法
Dec 13 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
vue mounted组件的使用
Jun 18 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 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和ACCESS写聊天室(七)
2006/10/09 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
php多任务程序实例解析
2014/07/19 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
理解javascript模块化
2016/03/28 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
python多线程http压力测试脚本
2019/06/25 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
职工运动会感言
2014/02/07 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
市场营销工作计划书
2014/05/06 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
孔庙导游词
2015/02/04 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript
python入门学习关于for else的特殊特性讲解
2021/11/20 Python