温故知新——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选择头像并实时显示的代码
Jun 27 Javascript
js 创建快捷方式的代码(fso)
Nov 19 Javascript
原生javaScript做得动态表格(注释写的很清楚)
Dec 29 Javascript
angularJS中router的使用指南
Feb 09 Javascript
html+js+highcharts绘制圆饼图表的简单实例
Aug 04 Javascript
JS Canvas定时器模拟动态加载动画
Sep 17 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
Element Carousel 走马灯的具体实现
Jul 26 Javascript
超详细小程序定位地图模块全系列开发教学
Nov 24 Javascript
小程序中手机号识别的示例
Dec 14 Javascript
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使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php查询whois信息的方法
2015/06/08 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
jQuery基础知识小结
2014/12/22 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
点球小游戏python脚本
2018/05/22 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
小学教师国培感言
2014/02/08 职场文书
创先争优承诺书范文
2014/03/31 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
公司的力量观后感
2015/06/05 职场文书
立案决定书范文
2015/06/24 职场文书