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 相关文章推荐
JS日历 推荐
Dec 03 Javascript
javascript中巧用“闭包”实现程序的暂停执行功能
Apr 04 Javascript
javascript 面向对象编程基础 多态
Aug 21 Javascript
使用jquery插件实现图片延迟加载技术详细说明
Mar 12 Javascript
浅析JavaScript基本类型与引用类型
May 28 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
jQuery实现自定义事件的方法
Apr 17 Javascript
JavaScript里实用的原生API汇总
May 14 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 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
用户的详细注册和判断
2006/10/09 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
python输入错误后删除的方法
2019/10/12 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
公司领导推荐信
2013/11/12 职场文书
房地产销售经理岗位职责
2014/01/01 职场文书
大学生志愿者感言
2014/01/15 职场文书
大学生社团活动总结
2014/04/26 职场文书
学校联谊协议书
2014/09/16 职场文书
司机个人年终总结
2015/03/03 职场文书
2016年春节慰问信息
2015/03/25 职场文书
2015年商场工作总结
2015/04/27 职场文书
初中思品教学反思
2016/02/20 职场文书