探讨js字符串数组拼接的性能问题


Posted in Javascript onOctober 11, 2014

我们知道,在js中,字符串连接是性能最低的操作之一。
例如:

var text="Hello";  

text+=" World!"; 

早期浏览器没有对这种运算进行优化。
由于字符串是不可变的,这意味着要创建中间字符串来存储连接的结果。频繁地在后台创建和销毁字符串导制性能异常低下。

因此,可以利用数组对象进行优化。
例如:

var buffer=[],i=0; 
buffer[i++]="Hello";  //通过相应索引值添加元素比push方法快 
buffer[i++]=" World!"; 
var text=buffer.join("");

在早期的浏览器中,没有创建和销毁中间字符串,在大量字符串连接情况下,这技术已被证明远快于使用加法方式。
 
如今浏览器对字符串的优化已经改变了字符串相连的局面。Safari、Opera、Chrome、Firefox和IE8都在使用加法运算符上表现出了更好的性能。但是,IE8之前的版本没有优化,因此数组方法依然有效。这并不意味着字符串相连时我们要进行浏览器检测。在决定如何连接时要考虑的是字符串的大小和数量。

当字符串相对较小(小于20字符)且连接数量也较小时(小于1000个),所有的浏览器使用加法运算符都能在不到1毫秒内轻松完成连接。增加字符串数量或大小时,IE7中性能会明显下降。字符串大小增加时,Firefox中加法运算符和数组成技巧性能差异会变小。字符串数量增加时,Safari中加法运算符和数组成技巧性能差异会变小。改变字符串数量或大小时,Chrome和Opera中加法运算符一直保持领先优势。

所以,由于在各浏览器下性能不一致,选用技术取决于实际情况和面对的浏览器。

大多数情况下,加法运算符是首选;如果用户主要使用IE6或7,并且字符串大小较大或数量较多时,那么数组技术就很值得。
 
一般情况下,如果是语义性的字符串,不应该使用Array,比如:
'Hello, my name is ' + name; 
 
如果字符串是"相似情况的重复"的话,建议使用Array,比如:

var array = []; 
for (i = 0; i < length; i++) { 
array[i] = '<li>' + list[i] + '</li'>; 
} 
document.getElementById('somewhere').innerHTML = array.join('\n');

有关js字符串数组连接的性能比较,就介绍到这里了,希望对大家有所帮助。

Javascript 相关文章推荐
Javascript typeof 用法
Dec 28 Javascript
js下用层来实现select的title提示属性
Feb 23 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
jQuery产品间断向下滚动效果核心代码
May 08 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
Sep 22 Javascript
使用js复制链接中的部分文字的方法
Jul 30 Javascript
JavaScript创建对象的方式小结(4种方式)
Dec 17 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
Aug 22 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 Javascript
原生js中运算符及流程控制示例详解
Jan 05 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 #Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
Oct 10 #Javascript
js点击button按钮跳转到另一个新页面
Oct 10 #Javascript
jQuery获取iframe的document对象的方法
Oct 10 #Javascript
jquery实现多行文字图片滚动效果示例代码
Oct 10 #Javascript
一个js过滤空格的小函数
Oct 10 #Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
Oct 10 #Javascript
You might like
[转帖]PHP世纪万年历
2006/12/06 PHP
PHP define函数的使用说明
2008/08/27 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
js点击选择文本的方法
2015/02/09 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
PHP经典面试题
2016/09/03 面试题
后勤岗位职责
2013/11/26 职场文书
社区七一党员活动方案
2014/01/25 职场文书
自荐书范文范例
2014/02/13 职场文书
开学典礼演讲稿
2014/05/23 职场文书
个人主要事迹材料
2014/08/26 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
2014年图书室工作总结
2014/12/09 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
Python Django获取URL中的数据详解
2021/11/01 Python