Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用扩展参数连接字符串的最有效方法_Javascript_Ecmascript 6_String Concatenation - Fatal编程技术网

Javascript 使用扩展参数连接字符串的最有效方法

Javascript 使用扩展参数连接字符串的最有效方法,javascript,ecmascript-6,string-concatenation,Javascript,Ecmascript 6,String Concatenation,我试图找到一种更好的方法来连接javascript ES6中的字符串。下面是当前的代码片段 方法1: function concat(...strings){ return ''.concat(...strings); } function concat(...strings){ return strings.join(''); } 方法2: function concat(...strings){ return ''.concat(...strings); } f

我试图找到一种更好的方法来连接javascript ES6中的字符串。下面是当前的代码片段

方法1:

function concat(...strings){
    return ''.concat(...strings);
}
function concat(...strings){
    return strings.join('');
}
方法2:

function concat(...strings){
    return ''.concat(...strings);
}
function concat(...strings){
    return strings.join('');
}
例如:

concat("Hey", "There", "How", "Are", "You"); // output is "HeyThereHowAreYou"

我不确定这些方法的性能,因为参数的数量可能会增加。任何评论都将不胜感激,这可能是最好的,或者任何其他方法都会有所帮助。

字符串连接可以通过多种方式完成

  • 加号(+)运算符。只要+运算符的一个操作数是字符串,它就会进行字符串连接。然后将另一个操作数转换为字符串。例如:

    “打招呼”+7+“快几次!” “快7次打招呼!”

  • 或者,您可以使用+=where

    a+=b

    是的缩写

    a=a+b

  • 连接字符串数组。收集要连接到数组中的字符串,然后将其连接起来

var-arr=[]

 arr.push("Say hello ");

 arr.push(7);

 arr.push(" times fast");

 arr.join("")
’Say hello 7 times fast’
哪一个更快?

字符串是不可变的,大多数结果为字符串的字符串操作都会生成新字符串

因此,字符串处理类似于JavaScript的C#或Java等语言都有特殊的类来帮助连接字符串。例如,C#调用这个类StringBuilder。然而,现代JavaScript引擎在内部优化了+操作符。Tom Schuster提到绳索是一种可能的优化技术。因此,JavaScript中不需要StringBuilder

只要使用+=就可以了

参考资料:

“Re:”–Brendan Eich的电子邮件指出,+在现代JavaScript引擎上速度更快


“”作者:Hans-J.Boehm,Russ Atkinson,Michael Plass.

ES5方法:如果您不确定是否传递了nos参数,请在函数中使用
参数
对象

函数concat(){
设str='';
for(设i=0;iconsole.log(结果_str)我建议使用。
原因是,它使用+=种围绕字符串数组的逻辑来连接,这是非常有效的

片段:

    _.reduce(['x', 'y', 'z'], function(accumulator, currentItem) {
    return accumulator + currentItem;
});
// xyz
参考:


随着参数数量的增加
您是否担心此函数会被传递数千个参数或其他什么?您可以只使用
join
而不使用它,您的用例是什么?“Hey”+“There”+“How”+“You”
不是选项吗?我担心参数和
concat
函数性能。
返回字符串。join()
似乎是更好的选择choice@Khauri麦克莱恩:我们在UI上使用D3,使用字符串concat逻辑以复杂的继承关系显示树结构。因此,在这种情况下,树组件可能会成倍增长,concat参数也会成倍增长。速度不是唯一的问题:字符串
+=
是内存杀手。@JanTuroň你能详细说明一下吗?您可以运行
newarray(99999999)。填充('a')。减少((acc,val)=>acc+val)没有任何明显的内存使用峰值。@JS中的str字符串是不可变的,
str+='a'
意味着分配的新内存要大一个字节,因此内存使用应该是O(n^2),大部分可能在进程中重复使用,因此您可能看不到峰值。最好将内存类型从数组转换为字符串,这样内存使用率为O(c)。Javascript没有办法做到这一点,但当我使用
Array(bigNumber).fill('a').join(''')
时,它似乎更优化了,在我的Chrome中使用了一小部分内存(仍然很不高效,在这类任务中使用脚本语言不是一个好主意-没有内存控制)。@JanTuroň是的,我知道:)但它(显然)不是一个好主意毕竟是“内存杀手”。@str有一次,我试图创建一个HTML页面,使用DIV的innerHTML上的
+=
逐个添加所有韩文字符。浏览器放弃了“javascript无响应”“。然后我尝试了使用分配数组的方法,因为字符数是已知的。由于缺少内存重新分配,响应时间不到10秒。关键是——你不能确定javascript到底做了什么,它的实现没有标准化。明天,被接受的答案可能是一个非常糟糕的主意。答案中缺少相关的部分——为什么、何时、何地您的代码可能更高效。一般来说,只使用代码的答案不是一个好答案。这是一个非常糟糕的答案,有几个原因,最重要的是你没有为此提供参考/源代码,甚至没有提供最低限度的解释。为什么你要使用lodash而不是just?当性能很重要时,对每个项使用函数调用不是一个好主意。从jsperf开始-必须使用简单循环。@Sohan:我正在寻找内存效率高的功能以及速度。