探讨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中this的使用详解
Nov 08 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
Dec 17 Javascript
node.js中的http.createServer方法使用说明
Dec 14 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
Feb 27 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
JavaScript实现的多个图片广告交替显示效果代码
Sep 04 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
JS实现的自定义水平滚动字体插件完整实例
Jun 17 Javascript
详解node如何让一个端口同时支持https与http
Jul 04 Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
vue实现在v-html的html字符串中绑定事件
Oct 28 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正则匹配汉字的方法介绍
2013/04/25 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
自荐信怎么写好
2013/11/11 职场文书
岗位职责的含义
2013/11/17 职场文书
导游个人求职信
2014/04/25 职场文书
网站出售协议书范文
2014/10/10 职场文书
简易离婚协议书范本
2014/10/24 职场文书
后备干部推荐材料
2014/12/24 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
Django drf请求模块源码解析
2021/06/08 Python