传统上,字符串连接一直是js中性能最低的操作之一。

var text="Hello";
text+=" World!";

早期浏览器没有对这种运算进行优化。由于字符串是不可变的,这意味着要创建中间字符串来存储连接的结果。频繁地在后台创建和销毁字符串导制性能异常低下。

发现这一点后,开发者们利用数组对象进行优化。

var buffer=[],i=0;
buffer[i++]="Hello"; //通过相应索引值添加元素比push方法快
buffer[i++]=" World!";
<SPAN class=Apple-style-span style="FONT-FAMILY: Helvetica, Tahoma, Arial, sans-serif; WHITE-SPACE: normal; BACKGROUND-COLOR: #ffffff">var text=buffer.join("");</SPAN>

在早期的浏览器中,没有创建和销毁中间字符串,在大量字符串连接情况下,这技术已被证明远快于使用加法方式

如今浏览器对字符串的优化已经改变了字符串相连的局面。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');

JavaScript字符串数组拼接的性能测试及优化方法的更多相关文章

  1. JavaScript判断数组是否包含指定元素的方法

    本文实例讲述了JavaScript判断数组是否包含指定元素的方法.分享给大家供大家参考.具体如下: 这段代码通过prototype定义了数组方法,这样就可以在任意数组调用contains方法 /** ...

  2. 探讨js字符串数组拼接的性能问题

    这篇文章主要介绍了有关js对字符串数组进行拼接的性能问题,字符串连接一直是js中性能最低的操作之一,应该如何解决呢?请参看本文的介绍 我们知道,在js中,字符串连接是性能最低的操作之一. 例如: 复制 ...

  3. JavaScript使用数组拼接字符串性能如何?

    传统上,字符串连接一直是js中性能最低的操作之一. view source   print? 1 var text="Hello"; 2 text+=" World!&q ...

  4. javascript 字符串数组链接

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。

  6. js中字符串的拼接的另一种方法

    // 按一定长度截断字符串,并使用 + 运算符进行连接. // 分隔字符串尽量按语义进行,如不要在一个完整的名词中间断开. // 特别的,对于HTML片段的拼接,通过缩进,保持和HTML相同的结构. ...

  7. JavaScript的数组实现队列与堆栈的方法

    一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 如下图所示: 1.2.堆栈的基本概念 堆栈:是一种支持后进先出(LIFO)的 ...

  8. rabbitmq之队列性能测试及优化方法(六)

    前言 下面关注一下rabbitmq实际使用时的性能问题和怎么进行一些优化. 性能测试 针对每个需要生产/消费者与rabbitmq进行通讯的方法进行测试 测试环境 排除网络IO的干扰,采用生产者和消费者 ...

  9. Javascript中数组的定义和常见使用方法

    一.定义数组 1.定义数组 var arry=[1,2,'小名',false] //var 数组名=[值1,值2,...] 2.设置数组长度 arry.length=10 //数组长度设置为10 二. ...

随机推荐

  1. NCPC 2016 October 8,2016 Artwork

    Problem A Artwork Problem ID: artwork Time limit: 4 seconds A template for an artwork is a white gri ...

  2. Revit二次开发示例:CancelSave

    在Revit程序中注册文件操作事件,保存新建或打开文件的信息.当保存时,如果当前文件内容和之前的一致时,则弹出对话框提示并取消保存.对话框中有一个功能链接,点击可打开插件所在目录. #region N ...

  3. 如何正确使用 Django的User Model

    阅读目录(Content) django——重写用户模型 1.修改配置文件,覆盖默认的User模型 2.引用User模型 3.指定自定义的用户模型 4.扩展Django默认的User 5.自定义用户与 ...

  4. 02-c#基础之01-基础语法(三)

    1.赋值运算符:"=" =:表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量. 由等号连接的表达式称之为赋值表达式. 注意:每个表达式我们都可以求解除一个定值,对于赋值表达 ...

  5. 奇妙的音乐-----WriteUp

    据说flag就藏在这段音乐中,请仔细听. 格式:CTF{} 解题链接:http://ctf5.shiyanbar.com/crypto/123.zip 下载压缩包后里面有个音乐的zip文件  但是加密 ...

  6. Go Web编程 第四章--处理请求

    请求和响应 Request结构 URL字段 Header字段 Body字段 Form, PostForm, MultipartForm字段 在处理器函数中,我们可以通过Request获取各个字段的详细 ...

  7. dubbo启动报java.lang.ClassNotFoundException: javassist.ClassPath

    原文: dubbo启动报java.lang.ClassNotFoundException: javassist.ClassPath         在dubbo启动的过程中报错误:java.lang. ...

  8. GIT(6)----fork和clone的区别,fetch与pull的区别

    参考资料: [1].Git学习笔记:fork和clone的区别,fetch与pull的区别 [2].在Github和Git上fork之简单指南

  9. CentOS 7修改网卡名为eth0

    第一步: 编辑文件加入如下所示参数 vi /etc/sysconfig/grub GRUB_CMDLINE_LINUX=”rd.lvm.lv=vg0/swap vconsole.keymap=us c ...

  10. COM/DCOM开发练习之进程内组件实例

    作者 : 卿笃军 题目说明: 仿照例题,在其基础上实现下面功能: 1)使用C++语言实现进程内组件,组件提供复数的加.减.乘.除等计算服务:client部分包含录入(实部和虚部分开录入)和查询部分. ...