温故知新——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判断两种格式的输入日期的正确性的代码
Mar 25 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
javascript 数字格式化输出的实现代码
Dec 10 Javascript
为开发者准备的10款最好的jQuery日历插件
Feb 04 Javascript
初识Node.js
Mar 20 Javascript
jQuery图片特效插件Revealing实现拉伸放大
Apr 22 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
总结javascript中的六种迭代器
Aug 16 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 Javascript
vue debug 二种方法
Sep 16 Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 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
基于mysql的论坛(2)
2006/10/09 PHP
php生成EXCEL的东东
2006/10/09 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Python configparser模块常用方法解析
2020/05/22 Python
python如何导入依赖包
2020/07/13 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
销售类个人求职信范文
2013/09/25 职场文书
公司合作意向书范文
2014/07/30 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
放假通知范文
2015/04/14 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
Python序列化模块JSON与Pickle
2022/06/05 Python