JavaScript链接的连接函数?

r6hnlfcb  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(95)

请不要使用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种不同的方法,但我不想用其他所有的方法来烦你。
有人知道这个谜题的答案吗?提前感谢!

jtw3ybtb

jtw3ybtb1#

你想做的事是不可能的。
你不能把一些东西链接到一个返回原语的方法调用上,因为原语没有(自定义的)方法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

相关问题