【发布时间】:2015-12-17 06:17:43
【问题描述】:
如何让函数接受 任一 命名参数 (foo({a: 'hello', b: 'it is me'})) 或 位置参数 (foo('hello', 'it is me'))?
我知道可以通过将对象传递给函数来模拟命名参数:
function foo(options) {
options = options || {};
var a = options.a || 'peanut'; // whatever default value
var b = options.b || 'butter'; // whatever default value
console.log(a, b);
}
// ES6 allows automatic destructuring
function foo({a = 'peanut', b = 'butter'} = {}) {
console.log(a, b);
}
但这不允许我接受要传递的位置参数。
我想使用 ES6,但 ES5 中的任何东西也可以。
【问题讨论】:
-
您可以检测出两种场景之间的差异,但前提是您了解预期的参数类型并可以对其进行测试以查看传递给函数的场景。
-
@jfriend00 想过检查第一个参数是否是一个对象,以确定是否使用了命名参数,但是如果我也需要
a作为一个对象怎么办。这会混淆这两种情况。有什么想法吗? -
用于检测不同变量传递方案的 JavaScript 技术取决于参数的类型和数量。你必须设计一个方案,让你区分不同的可能性。您可以查看How to Overload Functions in Javascript 来详细讨论这些可能性。
-
糖太多了。用显式输入编写好的函数。仅仅因为某种特定语言可能实现某些事情并不意味着您应该这样做。
标签: javascript parameter-passing ecmascript-6