温故知新——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实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
Nov 19 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
用jquery的attr方法实现图片切换效果
Feb 05 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
解决antd的Form组件setFieldsValue的警告问题
Oct 29 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 Javascript
微信小程序 根据不同用户切换不同TabBar
Apr 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
微博短链接算法php版本实现代码
2012/09/15 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
总结javascript三元运算符知识点
2018/09/28 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
Python httplib模块使用实例
2015/04/11 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Python partial函数原理及用法解析
2019/12/11 Python
Python 忽略文件名编码的方法
2020/08/01 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
Java语言的优势
2015/01/10 面试题
土建资料员岗位职责
2014/01/04 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
网络研修随笔感言
2014/02/17 职场文书
解除施工合同协议书
2014/10/17 职场文书
Mysql数据库命令大全
2021/05/26 MySQL