`

JavaScript 字符串连接性能问题质疑

    博客分类:
  • js
阅读更多

w3school 的 ECMAScript 定义类或对象 中举了个例子来说明javascript中字符串连接的性能问题

 

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. 把每个字符串复制到结果中的合适位置

然后举了一个代码例子,来说明性能。

 

function StringBuffer () {
  this._strings_ = new Array();
}

StringBuffer.prototype.append = function(str) {
  this._strings_.push(str);
};

StringBuffer.prototype.toString = function() {
  return this._strings_.join("");
};

var d1 = new Date();
var str = "";
for (var i=0; i < 100000; i++) {
    str += "text";
}
var d2 = new Date();

console.log(d2.getTime() - d1.getTime());

var buffer = new StringBuffer();
d1 = new Date();
for (var i=0; i < 100000; i++) {
    buffer.append("text");
}
var result = buffer.toString();
d2 = new Date();

console.log(d2.getTime() - d1.getTime());

 我机器上的结果是

75
125
直接拼接的性能好于使用数组,一个可能的解释是创建对象也要消耗较多的时间。

欢迎评论啊,:-D

分享到:
评论

相关推荐

    javascript字符串操作

    ### JavaScript字符串操作详解 在JavaScript中,字符串是用于表示文本数据的一种基本数据类型。字符串可以包含单个字符或多个字符组合成的文本序列。本文将详细介绍JavaScript中的字符串操作方法,帮助开发者更好地...

    JavaScript字符串函数大全

    JavaScript字符串函数大全 JS自带函数 JavaScript字符串函数大全 JS自带函数

    javascript 字符串连接的性能问题(多浏览器)

    这里需要注意的是,最新版本的Firefox已经修复了字符串连接性能问题,而旧版本的Firefox(如1.0或之后的版本)可能比普通的字符串连接更慢。 根据这些实验结果,可以得出以下几点关于字符串连接性能的知识点: 1. ...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册九:字符串

    2. 连接字符串:可以使用`+`运算符或`concat()`方法连接字符串。 3. 字符串切割:`slice()`, `substring()`, `substr()`用于截取字符串,`split()`根据分隔符切割成数组。 4. 查找替换:`indexOf()`查找指定子串首次...

    Javascript中字符串相关常用的使用方法总结

    - 在JavaScript中,可以使用`+`符号来连接字符串。 ```javascript var num = 1 + 2; // 数字相加 console.log(num); // 输出3 var msg = 'hello' + 'world'; // 字符串连接 console.log(msg); // 输出hello...

    javascript字符串排序

    在JavaScript编程语言中,字符串排序是一项常见的操作,特别是在处理用户输入、数据分析或者构建动态内容时。标题"javascript字符串排序"提示我们关注的重点是如何在JS环境中有效地对字符串进行排序。描述中提到的...

    theredoc让多行JavaScript字符串看起来排版更好

    然而,JavaScript原生不支持多行字符串,我们通常使用反斜杠(\)来连接多行,但这会导致代码可读性降低,排版混乱。为了解决这个问题,出现了诸如`template literals`(模板字面量)的特性,但有时它们仍不能满足对...

    你必须知道的JavaScript 中字符串连接的性能的一些问题

    在探讨JavaScript编程中,字符串连接是常见操作之一,但其性能问题往往会被人忽视。由于JavaScript的核心规范ECMAScript中字符串的不可变性,即字符串一旦创建,其内容就不能被改变,这意味着每次字符串连接操作实际...

    关于js中连接字符串效率的测试例子!

    在内部,JavaScript会创建新的字符串对象来存储连接结果,因此这种方式对于少量字符串连接效率尚可,但随着字符串数量增加,性能会下降,因为每次连接都会产生新的字符串对象。 2. 使用`Array.prototype.join()`:...

    javascript实现的字符串与十六进制表示字符串相互转换方法

    本文实例讲述了javascript实现的字符串与十六进制表示字符串相互转换方法。分享给大家供大家参考。具体如下: 之所以写这个,是因为发现SQL注入和XSS中经常利用十六进制表示的字符串,比如 SELECT CONCAT(0x68656c6...

    JavaScript中的字符串操作 .txt

    1. **字符串连接**:可以通过加号(`+`)来连接两个或多个字符串。例如: ```javascript var str1 = "Hello"; var str2 = "World"; var fullStr = str1 + ", " + str2; // 结果为 "Hello, World" ``` 2. **...

    JavaScript判断一个字符串是否包含指定子字符串的方法

    使用`includes`方法非常简单,它直接属于字符串对象,不需要通过原型扩展,也不用担心字符串特殊字符的问题,是推荐的现代JavaScript实践中的方法。 在介绍完方法之后,文章还提供了一个具体的使用示例。示例中通过...

    JavaScript语言教程:JavaScript 字符串

    ### JavaScript字符串方法详解 #### 一、概述 在JavaScript中,字符串是一种常用的数据类型,用于表示文本信息。字符串可以通过多种方式进行操作,例如查找字符、连接字符串等。本篇教程将详细介绍JavaScript中的...

    javaScript中的字符串操作

    ### JavaScript中的字符串操作知识点 #### 一、概述 在JavaScript编程中,字符串处理是一项非常基础且重要的技能。无论是用户输入的验证、DOM元素属性的读取与修改、还是Cookie的操作等场景,都离不开字符串的使用...

    JavaScript截取中文字符串

    ### JavaScript截取中文字符串知识点详解 #### 一、引言 在进行文本处理时,我们经常需要对字符串进行截取操作。特别是在处理包含多种字符集(如英文与中文)的字符串时,考虑到不同字符编码长度的差异性,简单地...

    ES6--javascript判断一个字符串是否存在另一个字符串中

    ### ES6 中 JavaScript 判断一个字符串是否存在另一个字符串中的方法 在 JavaScript 的开发过程中,经常会遇到需要判断一个字符串是否存在于另一个字符串中的场景。ES6(ECMAScript 2015)作为 JavaScript 的一个...

    连接 字符 串.rar

    - **Java**:在Java中,`+`运算符可以用于连接字符串,但频繁使用会导致性能问题,因为每次连接都会创建新的字符串对象。更高效的方案是使用`StringBuilder`或`StringBuffer`类。 - **JavaScript**:JavaScript的`...

Global site tag (gtag.js) - Google Analytics