请不要jQuery!
Web表示,应避免使用JS的本机String.concat()和join()函数,因为它们的性能较差,并且+ =分配的简单for()循环应工作得更快。
所以我试图用纯JavaScript创建一个将字符串连接在一起的函数。这是我预想的方式:
我想要一个主函数concatenate()来连接所有传递的参数,并在每个连接的参数之后插入一个字符串,最后一个除外。
如果main函数是由自身调用而没有链接的.using()函数,则该可变字符串应为空,这意味着结果中没有分隔符。
我想要一个链接的子函数.using(),该函数将告诉主concatenate()函数在每个串联的段之后添加除默认''空字符串之外的某些字符串。
从理论上讲,它应该像这样工作:
concatenate('a','b','c'); /* result: 'abc' */
concatenate('a','b','c').using('-'); /* result: 'a-b-c' */
我想避免有两个单独的函数,例如concatenate()和concatenateUsing(),因为concatenateUsing()变体将不得不使用特殊的常量参数(例如arguments [0]或arguments [arguments.length-1])作为注入的分隔符,那将非常不整洁。另外,我总是会忘记那是哪一个。
我还想避免使用具有两个单独子方法的替代Concatenate对象,例如Concatenate.strings()和Concatenate.using()或类似方法。
到目前为止,这是我失败的一些尝试...
尝试1:
function concatenate()
{
var result="";
if(this.separator===undefined){var separator=false;}
for(var i=0; i<arguments.length; i++)
{result += arguments[i] + ((separator && (i<arguments.length-1))?separator:'');}
this.using=function(x)
{
this.separator=x;
return this;
}
return result;
}
所以我想做的是:
检查分隔符变量是否未定义,这意味着尚未从子方法中设置它。
如果未定义,则将其声明为false以便以后评估。
运行串联,如果分隔符的值不是false,则在每个串联步骤中使用它-只要不是最后一次迭代即可。
然后返回结果。
子方法.using(x)应该在设置过程中的某个位置
分隔符变量的值。
自然,这是行不通的。
尝试2:
var concatenate = function()
{
var result="";
var separator="";
for(var i=0; i<arguments.length; i++)
{result += arguments[i] + ((separator && (i<arguments.length-1))?separator:'');}
return result;
}
concatenate.prototype.using=function(x)
{
this.separator=x;
return this;
}
它也行不通,我假设当从using()子方法返回该值时,主concatenate()函数的var分隔符=“”再次用“”覆盖了该值。
我现在尝试以4种或5种方式进行此操作,但我也不想让您感到厌烦。
有人知道这个难题的解决方案吗?
在此先多谢!
最佳答案
您试图做的是不可能的。
您不能将某些东西链接到返回原语的方法调用上,因为原语没有(自定义)方法1。
而且,您不能使第一个函数根据是否链接某些东西来返回不同的东西,因为它不知道其调用上下文,必须在评估方法调用之前返回结果。
最好的选择是返回一个可以使用自定义toString
方法进行字符串化的对象,并且还提供该using
东西。这将是类似的东西
function concatenate() {
return {
args: Array.from(arguments), // ES6 for simplicity
using: function(separator) {
return this.args.join(separator);
},
toString: function() {
return this.args.join("");
}
};
}
console.log(String(concatenate('a','b','c')); // result: 'abc'
// alternatively, use ""+… or explicitly call the ….toString() method
console.log(concatenate('a','b','c').using('-')); // result: 'a-b-c'
1:不,您不想知道workarounds。