请不要使用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;
}
所以我想做的是:
- 检查 separator 变量是否未定义,这意味着它还没有从子方法设置。
- 如果它是未定义的,则用值 false 声明它以供以后求值。
- 运行连接,如果 separator 的值不是 false,那么就在每个连接步骤中使用它--只要不是最后一次迭代。
- 然后返回结果。
- 子方法**.using(x)**应该沿着某个地方设置 separator 变量的值。
当然,这行不通。
尝试#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;
}
它也不起作用,我假设当 this 从**using()子方法返回时,mainconcatenate()**函数的 var separator="" 只是再次用“”覆盖该值。
我尝试了4或5种不同的方法,但我不想用其他所有的方法来烦你。
有人知道这个谜题的答案吗?提前感谢!
1条答案
按热度按时间jtw3ybtb1#
你想做的事是不可能的。
你不能把一些东西链接到一个返回原语的方法调用上,因为原语没有(自定义的)方法1。
而且,你不能让第一个函数根据某个函数是否被链接而返回不同的结果,因为它不知道它的调用上下文,并且必须在方法调用被求值之前返回结果。
最好的办法是返回一个可以使用定制的
toString
方法进行字符串化的对象,并且还提供using
功能。1:不,您不会想知道workarounds。