温故知新——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 学习笔记(十四) 正则表达式
Jan 22 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
node.js中的console.time方法使用说明
Dec 09 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
Vue.js实战之组件之间的数据传递
Apr 01 Javascript
前端构建工具之gulp的配置与搭建详解
Jun 12 Javascript
vue使用keep-alive实现数据缓存不刷新
Oct 21 Javascript
vue element项目引入icon图标的方法
Jun 06 Javascript
Vue一次性简洁明了引入所有公共组件的方法
Nov 28 Javascript
微信小程序版本自动更新的方法
Jun 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
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
秘书专业自荐信范文
2013/12/26 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
小学新教师培训方案
2014/02/03 职场文书
珍惜水资源建议书
2014/03/12 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
vue首次渲染全过程
2021/04/21 Vue.js
Echarts如何重新渲染实例详解
2022/05/30 Javascript