JavaScript链式连接函数?

时间:2015-06-03 16:14:36

标签: javascript string join concat method-chaining

请不要jQuery!

Web表示要避免JS的原生 String.concat() join()功能,因为它们性能不佳,而且简单 for()循环 + = 分配应该更快。

所以我试图在纯JavaScript中创建一个连接字符串的函数。这有点像我设想的那样:

  • 我想要一个主函数 concatenate(),它将连接所有传递的参数,并在每个连接的参数之后插入一个变量字符串,除了最后一个。

  • 如果main函数本身被调用而没有链接的 .using()函数,那么该变量字符串应该是空的,这意味着结果中没有分隔符。 / p>

  • 我想要一个链式子函数 .using(),它会告诉主 concatenate()函数除了默认的&#39以外的某些字符串;'在每个连接段之后添加的空字符串。

理论上,它应该像这样工作:

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()< / strong>或类似。

以下是我目前失败的一些尝试......

尝试#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 进行声明,以便以后进行评估。

  • 运行连接,如果分隔符具有 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;
}

它也不起作用,我假设当从使用()子方法返回 时, var separator =&主要 concatenate()函数的#34;&#34; 只是用&#34;&#34;覆盖了值。试。

我现在尝试了4到5种不同的方式,但我也不想让所有其他方式厌烦你。

有没有人知道这个谜题的解决方案? 非常感谢提前!

1 个答案:

答案 0 :(得分:3)

你要做的事情是不可能的。

您不能将某些内容链接到返回基元的方法调用,因为基元没有(自定义)方法 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