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 函数调用的对象和方法
Jul 01 Javascript
jQuery.fn和jQuery.prototype区别介绍
Oct 05 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
Sep 25 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
jquery validate demo 基础
Oct 29 Javascript
Bootstrap中CSS的使用方法
Feb 17 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
BootStrap模态框不垂直居中的解决方法
Oct 19 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
详解vuex的简单使用
Mar 12 Javascript
vue无限轮播插件代码实例
May 10 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 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 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
php常用文件操作函数汇总
2014/11/22 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python对切片命名的实现方法
2018/10/16 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
可贵的沉默教学反思
2014/02/06 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
2015年中个人总结范文
2015/03/10 职场文书
春节晚会开场白
2015/05/29 职场文书