请不要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

10-08 14:40