探讨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 相关文章推荐
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
使用jquery+CSS实现控制打印样式
Dec 31 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
浅谈angularJS中的事件
Jul 12 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
Jul 10 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
Jun 08 Javascript
vue前端工程的搭建
Mar 31 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
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python中scatter函数参数及用法详解
2017/11/08 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Django框架实现的分页demo示例
2019/05/25 Python
django 中QuerySet特性功能详解
2019/07/25 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
护理专业自荐信范文
2015/03/06 职场文书
学校重阳节活动总结
2015/03/24 职场文书
社区活动总结范文
2015/05/07 职场文书
立项申请报告范本
2015/05/15 职场文书
工程进度款催款函
2015/06/24 职场文书
运动会广播稿200字
2015/08/19 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python