JS下高效拼装字符串的几种方法比较与测试代码


Posted in Javascript onApril 15, 2010

在使用Ajax提交信息时,我可能常常需要拼装一些比较大的字符串通过XmlHttp来完成POST提交。尽管提交这样大的信息的做法看起来并不优雅,但有时我们可能不得不面对这样的需求。那么JavaScript中对字符串的累加速度如何呢?我们先来做下面的这个实验。累加一个长度为30000的字符串。
测试代码1 - 耗时: 14.325秒

var str = ""; 
for (var i = 0; i < 50000; i++) { 
str += "xxxxxx"; 
}

这段代码耗时14.325秒,结果并不理想。现在我们将代码改为如下的形式:
测试代码2 - 耗时: 0.359秒
var str = ""; 
for (var i = 0; i < 100; i++) { 
var sub = ""; 
for (var j = 0; j < 500; j++) { 
sub += "xxxxxx"; 
} 
str += sub; 
}

这段代码耗时0.359秒!同样的结果,我们做的只是首先拼装一些较小的字符串然后再组装成更大的字符串。这种做法可以有效的在字符串拼装的后期减小内存复制的数据量。知道了这一原理之后我们还可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时0.140秒。
测试代码3 - 耗时: 0.140秒
var strArray = new Array(); 
for (var i = 0; i < 100; i++) { 
var sub = ""; 
for (var j = 0; j < 500; j++) { 
sub += "xxxxxx"; 
} 
strArray.push(sub); 
} 
str = String.prototype.concat.apply("", strArray);

不过,上面这种做法也许并不是最好的!如果我们需要提交的信息是XML格式的(其实绝大多数情况下,我们都可以设法将要提交的信息组装成XML格式),我们还能找能更高效更优雅的方法—利用DOM对象为我们组装字符串。下面这段代买组装一个长度为950015的字符串仅须耗时0.890秒。
利用DOM对象组装信息 - 耗时: 0.890秒
var xmlDoc; 
if (browserType == BROWSER_IE) { 
xmlDoc = new ActiveXObject("Msxml.DOMDocument"); 
} 
else { 
xmlDoc = document.createElement("DOM"); 
} 
var root = xmlDoc.createElement("root"); 
for (var i = 0; i < 50000; i++) { 
var node = xmlDoc.createElement("data"); 
if (browserType == BROWSER_IE) { 
node.text = "xxxxxx"; 
} 
else { 
node.innerText = "xxxxxx"; 
} 
root.appendChild(node); 
} 
xmlDoc.appendChild(root); 
var str; 
if (browserType == BROWSER_IE) { 
str = xmlDoc.xml; 
} 
else { 
str = xmlDoc.innerHTML; 
}
Javascript 相关文章推荐
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
Aug 03 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
Oct 31 Javascript
iframe父页面获取子页面参数的方法
Feb 21 Javascript
node.js中的forEach()是同步还是异步呢
Jan 29 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
LayUI表格批量删除方法
Aug 15 Javascript
基于vue如何发布一个npm包的方法步骤
May 15 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 Javascript
js实现简单的无缝轮播效果
Sep 05 Javascript
三步搞定:Vue.js调用Android原生操作
Sep 07 Javascript
javascript的setTimeout()使用方法总结
Nov 20 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 #Javascript
JavaScript 保存数组到Cookie的代码
Apr 14 #Javascript
轻轻松松学JS调试(不下载任何工具)
Apr 14 #Javascript
jQuery EasyUI 中文API Button使用实例
Apr 14 #Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
Apr 14 #Javascript
JavaScript中的prototype使用说明
Apr 13 #Javascript
Js 刷新框架页的代码
Apr 13 #Javascript
You might like
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
jquery的each方法使用示例分享
2014/03/25 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
Python常用特殊方法实例总结
2019/03/22 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
python中round函数如何使用
2020/06/19 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
软件测试英文面试题
2012/10/14 面试题
岗位职责范本
2013/11/23 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
班级入场式解说词
2014/02/01 职场文书
机修工工作职责
2014/02/21 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
质量安全标语
2014/06/07 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
公司财务管理制度
2015/08/04 职场文书
公司备用金管理制度
2015/08/04 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA