温故知新——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数据缓存系统实现代码
Oct 24 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
Oct 30 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
layui 上传图片 返回图片地址的方法
Sep 26 Javascript
vue element upload组件 file-list的动态绑定实现
Oct 11 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
php实现微信支付之退款功能
2018/05/30 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python中functools模块的常用函数解析
2016/06/30 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python pycharm的安装及其使用
2019/10/11 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
入股协议书
2014/04/14 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫