温故知新——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 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
javascript 读取xml,写入xml 实现代码
Jul 10 Javascript
javascript parseInt 大改造
Sep 27 Javascript
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
JS实现动态修改table及合并单元格的方法示例
Feb 20 Javascript
微信小程序实现轮播图效果
Sep 07 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
Nov 06 Javascript
写给小白看的JavaScript异步
Nov 29 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
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模板,主要想体现一下思路
2006/12/25 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
Javascript实现的分页函数
2007/02/07 Javascript
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
详解Python3的TFTP文件传输
2018/06/26 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
SQL面试题
2013/04/30 面试题
简单英文演讲稿
2014/01/01 职场文书
数学检讨书1000字
2014/02/24 职场文书
介绍信格式样本
2015/05/05 职场文书
学生检讨书怎么写
2015/05/07 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA