温故知新——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 相关文章推荐
用js实现多域名不同文件的调用方法
Jan 12 Javascript
Javascript 面向对象之重载
May 04 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
获取IE浏览器Cookie信息的方法
Jan 23 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
vue模块拖拽实现示例代码
Mar 09 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
Sep 03 Javascript
JS实现密码框效果
Sep 10 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
Sep 21 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
python读取各种文件数据方法解析
2018/12/29 Python
Django 多环境配置详解
2019/05/14 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
总监职责范文
2013/11/09 职场文书
法人委托书范本
2014/04/04 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
开学典礼校长致辞
2015/07/29 职场文书
合理化建议书范文
2015/09/14 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL