探讨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 Discuz代码中的msn聊天小功能
May 25 Javascript
JavaScript 捕获窗口关闭事件
Jul 26 Javascript
javascript之AJAX框架使用说明
Apr 24 Javascript
js实现的仿新浪微博完美的时间组件升级版
Dec 20 Javascript
js原生appendChild的bug解决心得分享
Jul 01 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
Apr 15 Javascript
AngularJS语法详解
Jan 23 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
Jul 24 Javascript
JS如何设置元素样式的方法示例
Aug 28 Javascript
如何使用vuex实现兄弟组件通信
Nov 02 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
IDEA安装vue插件图文详解
Sep 26 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
python hough变换检测直线的实现方法
2019/07/12 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
医药销售求职信范文
2014/02/01 职场文书
三方股东合作协议书
2014/10/28 职场文书
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python