探讨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 相关文章推荐
Jquery 快速构建可拖曳的购物车DragDrop
Nov 30 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javascript实现数字+字母验证码的简单实例
Feb 10 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
jquery读写cookie操作实例分析
Dec 24 Javascript
JS日程管理插件FullCalendar简单实例
Feb 07 Javascript
vue.js实现请求数据的方法示例
Feb 07 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
分享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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
Python中atexit模块的基本使用示例
2015/07/08 Python
利用python在excel中画图的实现方法
2020/03/17 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
如何学习Python time模块
2020/06/03 Python
Python计算信息熵实例
2020/06/18 Python
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
社区敬老月活动实施方案
2014/02/17 职场文书
公司活动方案范文
2014/03/06 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
升学宴祝酒词
2015/08/11 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL