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 学习之旅 (2)
Feb 05 Javascript
JavaScript 基础篇(一)
Mar 30 Javascript
jQuery中获取Radio元素值的方法
Jul 02 Javascript
JavaScript 命名空间 使用介绍
Aug 29 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
May 09 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
Mar 30 Javascript
vue-cli项目中怎么使用mock数据
Sep 27 Javascript
在vue项目中使用Nprogress.js进度条的方法
Jan 31 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
layui在form表单页面通过Validform加入简单验证的方法
Sep 06 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获取远程图片体积大小的实例
2013/11/12 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
Express.JS使用详解
2014/07/17 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
python编码总结(编码类型、格式、转码)
2016/07/01 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Python接口测试文件上传实例解析
2020/05/22 Python
python中pow函数用法及功能说明
2020/12/04 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
毕业生求职的求职信
2013/12/05 职场文书
工程招投标邀请书
2014/01/30 职场文书
汽车促销活动方案
2014/03/31 职场文书
请假条范文大全
2014/04/10 职场文书
公司经营目标责任书
2015/01/29 职场文书
2015团员个人年度总结
2015/11/24 职场文书
公司转让协议书
2016/03/19 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript