Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将参数传递给函数而无需命令_Javascript_Angularjs - Fatal编程技术网

Javascript 将参数传递给函数而无需命令

Javascript 将参数传递给函数而无需命令,javascript,angularjs,Javascript,Angularjs,我有这样一个函数: let showNotification = function(a,b,c,d,e,f){ console.log(a,b,c,d,e,f); } let showNotification = function(objectParam){ console.log(objectParam.a, objectParam.b, objectParam.c, objectParam.d, objectParam.e, objectParam.f) } showNotifica

我有这样一个函数:

let showNotification = function(a,b,c,d,e,f){
  console.log(a,b,c,d,e,f);
}
let showNotification = function(objectParam){
console.log(objectParam.a, objectParam.b, objectParam.c, objectParam.d, objectParam.e, objectParam.f)
}
showNotification("the required param")
    .withA(value_for_a)
    .withC(value_for_c)
    .go();
调用此函数时,我知道我需要遵循如下顺序(如果我不想为c、d、e传递参数):

但这迫使我确保我通过了所有参数,并且它应该是有序的

在这种情况下,我正在寻找一种通过param的更好方法

我知道我可以创建一个param对象,而不是在其中传递值。大概是这样的:

let showNotification = function(a,b,c,d,e,f){
  console.log(a,b,c,d,e,f);
}
let showNotification = function(objectParam){
console.log(objectParam.a, objectParam.b, objectParam.c, objectParam.d, objectParam.e, objectParam.f)
}
showNotification("the required param")
    .withA(value_for_a)
    .withC(value_for_c)
    .go();
那就叫它:

showNotification({a: 1, b: 2, e:6});
我可以通过整个物体,但这不是我所看到的。我不想每次都为此创建对象

大声思考,如果有一种方法可以传递字符串值,而不考虑顺序


我看到一些关于这方面的死板帖子,但没有人有解决办法。

TL;DR我知道您不想使用对象,但现代JavaScript引擎在创建和处理对象方面非常快,并且使用参数默认值和参数分解,我认为options对象是您最好的选择。有关详细信息,请参见下面的“关于传入对象的说明(默认设置、分解)”


您已经介绍了两个主要选项(下面我将对传入对象版本做一些说明)。第三种选择是采用生成器模式的一种变体,但它也涉及到使用对象。你说过你不想那样做,但没有说为什么不。请注意,现代JavaScript引擎创建和处理对象的速度非常非常快,如果您担心的话

标记字符串 阅读时,我想到了第四个选项:不必这样做,您可以在参数列表中使用标记字符串来指示下一个参数是什么,例如:

showNotification("the required parameter", "a", value_for_a, "c", value_for_c);
乍一看,这并不涉及创建对象,但在现代JavaScript引擎上,处理它将创建一个没有以其他方式创建的对象:
参数
,传入参数的伪数组。因为那个(或者一个rest参数,它也创建了一个对象)是您可以使用这样一个东西的唯一合理的方式

基于生成器的变量 在这种方法中,main函数返回一个builder对象,其中包含各种选项的setter,然后返回一个启动流程的最终“Yep,we's ready”调用(在builder模式中,最终调用通常构建最终对象)。使用它看起来像这样:

let showNotification = function(a,b,c,d,e,f){
  console.log(a,b,c,d,e,f);
}
let showNotification = function(objectParam){
console.log(objectParam.a, objectParam.b, objectParam.c, objectParam.d, objectParam.e, objectParam.f)
}
showNotification("the required param")
    .withA(value_for_a)
    .withC(value_for_c)
    .go();
与其他方法相比,实现这一点很复杂,但并不困难

关于传入对象的说明(默认值、解构) 如果确实使用了某个对象(尽管不想),可以使用和使该对象更便于使用:

让showNotification=function({a=1,b=2,c=3,d=4,e=5,f=6}={/*如果根本没有对象,则默认值*/a:“foo”}){
控制台日志(a、b、c、d、e、f);
};
showNotification();
showNotification({});

显示通知({a:42})
@T,J.Crowder
回答说比这个好。换句话说,您可以使用。正如您所说,这里的东西都是可选的,除了第一个参数。所以您应该传递第一个参数值。除非您愿意,否则您不需要传递其他值。但是您应该在数组中用
将参数值的位置表示为空<代码>在我的例子中,您应该创建一个对象或数组。

例如。如果您有一个动态数组,其中包含值(除了位置以外的任何值都是必需的)和位置
[1,3]
。然后,spread运算符帮助将该动态数组与函数参数合并

让showNotification=函数(a、b、c、d、e、f){
控制台日志(a、b、c、d、e、f);
};
设部分=[2,3,6]//认为它是运行时或编译时的动态数组
展示通知(1,…部分)尚未作为答案发布,因此我将其作为社区wiki发布:

您可以将各个参数的(concat)标记预加或附加到字符串中,例如,如果要发送表示参数d的参数,并且要传递的字符串是“myString”,则您可以决定标记的格式,如$&d&$,因此您的参数将如“myString$&d&$”


创建一个具有所需参数的新方法。这里的问题是,除了第一个参数之外,所有参数都是可选的。我可以想出一种有趣的方法来做到这一点,你可以为各自的参数预先添加或附加(concat)标记到你的字符串中,例如,如果你想发送表示参数d的参数,而你想传递的字符串是“myString”,然后,您可以决定令牌的格式,如$&d&$,因此您的参数将看起来像“myString$&d&$”,然后在函数中,您可以简单地扫描令牌,并通过修剪/切分令牌来分配相应的变量,给出实际的字符串值。非常感谢所有人的响应。我将再等一个小时,并接受最佳答案(最好的方式),请注意,spread不是运营商(也不可能是运营商)。这只是语法。@T.J.Crowder我已经附加了一些相同概念的链接。可能链接有助于操作他想要的内容。@T.J.Crowder我希望spread操作员正在为动态数据传递工作。如果他有一个带有动态值的数组,该数组带有
一个参数位置。那么,传播就是合并。我是对的吗?我现在明白了spread在这里的作用(很抱歉错过了它),但我不能说我对它有多大的看法;你仍然有位置混乱。(请注意,您不必使用变量:
showNotification(a,…[2,3,6]);
)@t.J.Crowder。这就是我在上面的回答中提到的你的名字。我的想法不是关于硬编码数组/对象。我用
对象
位置回答动态
数组
。感谢@T.J.Crowder,我无法访问此页面,与此相关的所有通知都已消失。为什么会这样?我可以从我个人资料的“所有动作”中回到这一点tab@BhushanBabar当前位置我不知道你为什么在SO的网站上遇到问题。