我发现c#中的命名参数特性在某些情况下非常有用。
calculateBMI(70, height: 175);
如果我想在JavaScript中使用这个,我可以使用什么?
我不想要的是:
myFunction({ param1: 70, param2: 175 });
function myFunction(params){
// Check if params is an object
// Check if the parameters I need are non-null
// Blah blah
}
这个方法我已经用过了。还有别的办法吗?
我可以使用任何库来做到这一点。
与通常认为的相反,命名参数可以在标准的旧式JavaScript中(仅用于布尔参数)通过简单、整洁的编码约定实现,如下所示。
function f(p1=true, p2=false) {
...
}
f(!!"p1"==false, !!"p2"==true); // call f(p1=false, p2=true)
警告:
必须保留参数的顺序——但这种模式仍然有用,因为它可以很明显地显示哪个实际参数对应哪个形式参数,而不必为函数签名进行grep或使用IDE。
这只适用于布尔值。但是,我相信可以使用JavaScript独特的类型强制语义为其他类型开发类似的模式。
NB。正如评论中提到的,我2016年的答案是不正确的,具有误导性。
尝试Node-6.4.0 (process.versions. Node-6.4.0)。v8 = '5.0.71.60')和Node Chakracore-v7.0.0-pre8,然后是Chrome-52 (v8 =5.2.361.49),我注意到命名参数几乎是实现的,但顺序仍然优先。我找不到ECMA标准是怎么说的。
>function f(a=1, b=2){ console.log(`a=${a} + b=${b} = ${a+b}`) }
> f()
a=1 + b=2 = 3
> f(a=5)
a=5 + b=2 = 7
> f(a=7, b=10)
a=7 + b=10 = 17
但是必须遵守秩序!!这是标准行为吗?
> f(b=10)
a=10 + b=2 = 12
另一种方法是使用一个合适对象的属性,例如:
function plus(a,b) { return a+b; };
Plus = { a: function(x) { return { b: function(y) { return plus(x,y) }}},
b: function(y) { return { a: function(x) { return plus(x,y) }}}};
sum = Plus.a(3).b(5);
当然,对于这个虚构的例子来说,它是没有意义的。但在函数看起来像这样的情况下
do_something(some_connection_handle, some_context_parameter, some_value)
它可能更有用。它还可以与“parameterfy”思想相结合,以通用的方式从现有函数中创建这样一个对象。也就是说,它将为每个形参创建一个成员,该成员可以求值为函数的部分求值版本。
这个想法当然与Schönfinkeling也就是curiling有关。