温故知新——JavaScript中的字符串连接问题最全总结(推荐)


Posted in Javascript onAugust 21, 2017

ECMAScript 中最常见的一个问题是字符串连接的性能。与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变。请考虑下面的代码:

var str = "hello ";
str += "world";

实际上,这段代码在幕后执行的步骤如下:

1、创建存储 "hello " 的字符串。
2、创建存储 "world" 的字符串。
3、创建存储连接结果的字符串。
4、把 str 的当前内容复制到结果中。
5、把 "world" 复制到结果中。
6、更新 str,使它指向结果。

每次完成字符串连接都会执行步骤 2 到 6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用 Array 对象存储字符串,然后用 join() 方法(参数是空字符串)创建最后的字符串。想象用下面的代码代替前面的代码:

var arr = new Array();
arr[0] = "hello ";
arr[1] = "world";
var str = arr.join("");

这样,无论数组中引入多少字符串都不成问题,因为只在调用 join() 方法时才会发生连接操作。此时,执行的步骤如下:
1、创建存储结果的字符串
2、把每个字符串复制到结果中的合适位置

虽然这种解决方案很好,但还有更好的方法。问题是,这段代码不能确切反映出它的意图。要使它更容易理解,可以用 StringBuffer 类打包该功能:

function StringBuffer () {
 this._strings_ = new Array();
}
StringBuffer.prototype.append = function(str) {
 this._strings_.push(str);
};
StringBuffer.prototype.toString = function() {
 return this._strings_.join("");
};

这段代码首先要注意的是 strings 属性,本意是私有属性。它只有两个方法,即 append() 和 toString() 方法。append() 方法有一个参数,它把该参数附加到字符串数组中,toString() 方法调用数组的 join 方法,返回真正连接成的字符串。要用 StringBuffer 对象连接一组字符串,可以用下面的代码:

var buffer = new StringBuffer ();
buffer.append("hello ");
buffer.append("world");
var result = buffer.toString();

可用下面的代码测试 StringBuffer 对象和传统的字符串连接方法的性能:

var d1 = new Date();
var str = "";
for (var i=0; i < 10000; i++) {
 str += "text";
}
var d2 = new Date();
document.write("Concatenation with plus: "
 + (d2.getTime() - d1.getTime()) + " milliseconds");
var buffer = new StringBuffer();
d1 = new Date();
for (var i=0; i < 10000; i++) {
 buffer.append("text");
}
var result = buffer.toString();
d2 = new Date();
document.write("<br />Concatenation with StringBuffer: "
 + (d2.getTime() - d1.getTime()) + " milliseconds");

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助~如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持!

Javascript 相关文章推荐
JQuery Study Notes 学习笔记(一)
Aug 04 Javascript
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
JavaScript中伪协议 javascript:使用探讨
Jul 18 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
js CSS3实现卡牌旋转切换效果
Jul 04 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
JS array数组检测方式解析
May 19 Javascript
JQuery使用数组遍历跳出each循环
Sep 01 jQuery
Vue.js实现按钮的动态绑定效果及实现代码
Aug 21 #Javascript
Node.js简单入门前传
Aug 21 #Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 #Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 #Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 #jQuery
详解webpack的配置文件entry与output
Aug 21 #Javascript
jQuery模拟爆炸倒计时功能实例代码
Aug 21 #jQuery
You might like
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
再论Javascript的类继承
2011/03/05 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python截取两个单词之间的内容方法
2018/12/25 Python
python交换两个变量的值方法
2019/01/12 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
大学生个人简历自我评价
2013/11/16 职场文书
五一劳动节活动记录
2014/03/23 职场文书
学校食堂标语
2014/10/06 职场文书
晚会开场白和结束语
2015/05/29 职场文书
排球赛新闻稿
2015/07/17 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏