探讨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和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
js去除浏览器默认底图的方法
Jun 08 Javascript
vue分页组件table-pagebar使用实例解析
Nov 15 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
Sep 15 Javascript
js正则取值的结果数组调试方法
Oct 10 Javascript
微信小程序与webview交互实现支付功能
Jun 07 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
vue路由跳转传递参数的方式总结
May 10 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 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
用PHP函数解决SQL injection
2006/10/09 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python3实现高效的端口扫描
2019/08/31 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
EJB面试题
2015/07/28 面试题
小小的船教学反思
2014/02/21 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
解除合同协议书
2014/04/17 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL