探讨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 相关文章推荐
杨氏矩阵查找的JS代码
Mar 21 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
JavaScript实现select添加option
Jul 03 Javascript
js实现贪吃蛇小游戏(容易理解)
Jan 22 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
Mar 09 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
Mar 23 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
基于ionic实现下拉刷新功能
May 10 Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
Node.js+ELK日志规范的实现
May 23 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 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
python连接池实现示例程序
2013/11/26 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python切片操作深入详解
2018/07/27 Python
基于django传递数据到后端的例子
2019/08/16 Python
python求绝对值的三种方法小结
2019/12/04 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
医学类个人求职信范文
2014/02/05 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
体育比赛口号
2014/06/09 职场文书
中秋节活动总结
2014/08/29 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
《假如》教学反思
2016/02/17 职场文书
导游词之天津盘山
2019/11/01 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle