探讨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 Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
禁用Enter键表单自动提交实现代码
May 22 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
May 22 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
微信小程序 tabs选项卡效果的实现
Jan 05 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
Mar 08 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
vue中的inject学习教程
Apr 24 Javascript
vue实现中部导航栏布局功能
Jul 30 Javascript
vue-cropper组件实现图片切割上传
May 27 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
php中explode与split的区别介绍
2012/10/03 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JavaScript中string对象
2015/06/12 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
python获取指定网页上所有超链接的方法
2015/04/04 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
python3调用windows dos命令的例子
2019/08/14 Python
python函数的作用域及关键字详解
2019/08/20 Python
简单的Python人脸识别系统
2020/07/14 Python
Python 必须了解的5种高级特征
2020/09/10 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
人事部经理岗位职责
2014/03/07 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python