温故知新——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 相关文章推荐
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
仿微博字符限制效果实现代码
Apr 20 Javascript
常用的几段javascript代码分享
Mar 25 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
jquery 判断selection range 是否在容器中的简单实例
Aug 02 Javascript
canvas绘制万花筒效果(代码分享)
Jan 20 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
web前端vue之CSS过渡效果示例
Jan 10 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
Aug 22 Javascript
JS使用Chrome浏览器实现调试线上代码
Jul 23 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 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 数组的指针操作实现代码
2011/02/08 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
PHP反射学习入门示例
2019/06/14 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
python中pass语句用法实例分析
2015/04/30 Python
python实现合并两个数组的方法
2015/05/16 Python
Python set常用操作函数集锦
2017/11/15 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
《赠汪伦》教学反思
2014/04/12 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
Python绘制散乱的点构成的图的方法
2022/04/21 Python