探讨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 相关文章推荐
一些mootools的学习资源
Feb 07 Javascript
Three.js源码阅读笔记(Object3D类)
Dec 27 Javascript
一个jquery实现的不错的多行文字图片滚动效果
Sep 28 Javascript
javascript实现简单的鼠标拖动效果实例
Apr 10 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
JavaScript中清空数组的三种方式
Mar 22 Javascript
Angular2整合其他插件的方法
Jan 20 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
js异步接口并发数量控制的方法示例
Nov 22 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
详解js的作用域、预解析机制
2018/02/05 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
运动会通讯稿150字
2014/02/15 职场文书
保护环境的建议书
2014/03/12 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
雨花台导游词
2015/02/06 职场文书
信访工作个人总结
2015/03/03 职场文书
企业工会工作总结2015
2015/05/13 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
详解如何使用Nginx解决跨域问题
2022/05/06 Servers