gpt4 book ai didi

JavaScript 链式连接函数?

转载 作者:行者123 更新时间:2023-11-29 19:26:15 24 4
gpt4 key购买 nike

请不要使用 jQuery!

网络上说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])作为注入(inject)的分隔符,这会非常不整洁。另外,我总是会忘记它是哪一个。

我还想避免使用两个单独的子方法取代 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) 应该在某个地方设置分隔符 变量的值。

当然,这行不通。

尝试#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;
}

它也不起作用,我假设当 thisusing() 子方法返回时,var separator="" 的主要 concatenate() 函数只是再次用 ""覆盖值。

我现在尝试了 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 .

关于JavaScript 链式连接函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30625449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com