温故知新——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 相关文章推荐
javascript脚本调试方法小结
Nov 24 Javascript
Array的push与unshift方法性能比较分析
Mar 05 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 Javascript
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 Javascript
js修改onclick动作的四种方法(推荐)
Aug 18 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 Javascript
Javascript实现关闭广告效果
Jan 29 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实现的生成静态HTML速度快类库
2007/03/31 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
Position属性之relative用法
2015/12/14 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
毕业生自荐信
2013/12/14 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
广告语设计及教案
2014/03/21 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
教师个人培训总结
2015/02/11 职场文书
学前教育见习总结
2015/06/23 职场文书
公司费用报销管理制度
2015/08/04 职场文书