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动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
基于jQuery实现图片的前进与后退功能
Apr 24 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
jquery制作LED 时钟特效
Feb 01 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
Element MessageBox弹框的具体使用
Jul 27 Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 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
解析PHP可变函数的经典用法
2013/06/20 PHP
php数据库备份还原类分享
2014/03/20 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
2017/11/06 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
卫校毕业生自我鉴定
2013/10/31 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
国培教师自我鉴定
2014/02/12 职场文书
房地产推广策划方案
2014/05/19 职场文书
作弊检讨书
2015/01/27 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书