探讨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语句可以不以;结尾的烦恼
Mar 08 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
May 05 Javascript
js点击选择文本的方法
Feb 09 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
原生js实现轮播图的示例代码
Feb 20 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
Sep 07 jQuery
vue使用iframe嵌入网页的示例代码
Jun 09 Javascript
JS实现520 表白简单代码
May 21 Javascript
小程序自定义日历效果
Dec 29 Javascript
js实现无缝轮播图
Mar 09 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
python写一个md5解密器示例
2018/02/23 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
python开发一款翻译工具
2020/10/10 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
计算机相关的自我评价
2014/01/15 职场文书
家长通知书家长评语
2014/04/17 职场文书
副处级干部考察材料
2014/05/17 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
python实现自动清理文件夹旧文件
2021/05/10 Python
python3实现常见的排序算法(示例代码)
2021/07/04 Python
html5表单的required属性使用
2021/07/07 HTML / CSS