温故知新——JavaScript中的字符串连接问题最全总结(推荐)

发布时间 - 2026-01-11 02:53:41    点击率:

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");

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助~如果有疑问大家可以留言交流,谢谢大家对的支持!


# js  # 字符串连接  # 浅谈JS中的三种字符串连接方式及其性能比较  # 你必须知道的JavaScript 中字符串连接的性能的一些问题  # 再论Javascript下字符串连接的性能  # 数组方法解决JS字符串连接性能问题有争议  # javascript下高性能字符串连接StringBuffer类  # JS 字符串连接[性能比较]  # JavaScript 字符串连接性能优化  # javascript 字符串连接的性能问题(多浏览器)  # 这段  # 可以用  # 问题是  # 的是  # 组中  # 这一  # 就会  # 很好  # 都不  # 成问题  # 要注意  # 要用  # 只在  # 这篇文章  # 谢谢大家  # 更容易  # 时才  # 解决方法  # 最常见  # 使它 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Python数据仓库与ETL构建实战_Airflow调度流程详解  移动端脚本框架Hammer.js  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  JavaScript如何实现继承_有哪些常用方法  如何快速搭建高效香港服务器网站?  EditPlus中的正则表达式实战(5)  如何在云虚拟主机上快速搭建个人网站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  微信h5制作网站有哪些,免费微信H5页面制作工具?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  高性价比服务器租赁——企业级配置与24小时运维服务  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何实现数据库事务?(DB Facade示例)  QQ浏览器网页版登录入口 个人中心在线进入  php 三元运算符实例详细介绍  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  网站制作壁纸教程视频,电脑壁纸网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  jQuery中的100个技巧汇总  html如何与html链接_实现多个HTML页面互相链接【互相】  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Linux系统运维自动化项目教程_Ansible批量管理实战  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  EditPlus中的正则表达式 实战(1)  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何实现文件上传和存储?(本地与S3配置)  微信小程序 wx.uploadFile无法上传解决办法  JavaScript模板引擎Template.js使用详解  如何在万网自助建站中设置域名及备案?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel如何使用Sanctum进行API认证?(SPA实战)  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】