如何让函数接受 命名参数(file_open
)或位置参数(foo({a: 'hello', b: 'it is me'})
)?
我知道可以通过将对象传递给函数来模拟命名参数:
foo('hello', 'it is me')
但这不允许我接受传递的位置参数。
我想使用ES6,但是ES5的任何东西都可以。
答案 0 :(得分:1)
我认为这样的事情会起作用:
function foo(...options){
if (typeof options[0] === 'object'){
console.log('expect object', options[0]);
}else{
console.log('expect array', options);
}
}
foo('peanut', 'butter');
foo({a:'peanut', b:'butter'});
答案 1 :(得分:1)
首先,我真的建议坚持使用一个appraoch。如你所说,使用 "命名为"
function foo({a = 'peanut', b = 'butter'} = {}) {
console.log(a, b);
}
或位置参数:
function foo(a = 'peanut', b = 'butter') {
console.log(a, b);
}
选择最适合您功能的不要混合。
如果您出于某种原因确实需要两者,standard overloading techniques可供您使用。只有当您的第一个位置参数不是对象时,它才能正常工作。我会提出以下习语之一:
function foo(a, b) { // positional is normal case
if (arguments.length == 1 && typeof arguments[0] == "object")
{a, b} = arguments[0];
console.log(a, b);
}
function foo({a, b}) { // named is normal case
if (arguments.length > 1 || typeof arguments[0] != "object")
[a, b] = arguments;
console.log(a, b);
}
如果你需要默认值,它会变得丑陋:
function foo(a, b) {
var opts = (arguments.length == 1 && typeof arguments[0] == "object")
? arguments[0]
: {a, b};
({a = 'peanut', b = 'butter'} = opts);
console.log(a, b);
}
答案 2 :(得分:0)
我认为没有为此内置的内容,但此代码适用于您的情况
function foo({a = 'peanut', b = 'butter'} = {}) {
if (typeof arguments[0] === 'string') {
return foo({a: arguments[0], b: arguments[1]})
}
console.log(a, b);
}