使中间参数可选的惯用方法
Idiomatic way to make middle arguments optional
实现中间参数是可选的但最后一个参数是必需的 JavaScript 函数的常用方法是什么?惯用的 ES2015 解决方案是首选。
例如,我经常看到可以通过多种方式调用的函数,如下所示:
func(firstArg, callback);
func(firstArg, options, callback);
所以实际发生的是参数的数量影响每个参数的解释。
我知道我可以通过检查参数的长度来处理这个问题,像这样:
// func(firstArg, options, callback);
// or: func(firstArg, callback);
function (firstArg, ...args) {
let options = {};
if (args.length > 1) {
options = args.shift();
}
let callback = args[0];
// And do stuff ...
}
但它看起来很笨重。有更好的方法吗?
使用..args
和pop()
来自数组的回调:
function thing(...args) {
var cb = args.pop();
//... args is now [1, obj]
cb(args[0]);
}
thing(1, { a: 1 }, function (data) {
console.log(data); // 1
});
一种惯用的方法是进行类型检查。您还可以利用默认参数。
function test(firstArg, callback, options = {}) {
if (typeof options == 'function') {
callback = arguments[2];
options = arguments[1];
}
}
这不仅可以确保您始终拥有一个选项对象,而且在有人切换 callback
和 options
的参数时也能正常工作。因此,选项排在第二位还是最后并不重要。此外,也许更重要的是,源代码清楚地告诉了我们它的意图。
实现中间参数是可选的但最后一个参数是必需的 JavaScript 函数的常用方法是什么?惯用的 ES2015 解决方案是首选。
例如,我经常看到可以通过多种方式调用的函数,如下所示:
func(firstArg, callback);
func(firstArg, options, callback);
所以实际发生的是参数的数量影响每个参数的解释。
我知道我可以通过检查参数的长度来处理这个问题,像这样:
// func(firstArg, options, callback);
// or: func(firstArg, callback);
function (firstArg, ...args) {
let options = {};
if (args.length > 1) {
options = args.shift();
}
let callback = args[0];
// And do stuff ...
}
但它看起来很笨重。有更好的方法吗?
使用..args
和pop()
来自数组的回调:
function thing(...args) {
var cb = args.pop();
//... args is now [1, obj]
cb(args[0]);
}
thing(1, { a: 1 }, function (data) {
console.log(data); // 1
});
一种惯用的方法是进行类型检查。您还可以利用默认参数。
function test(firstArg, callback, options = {}) {
if (typeof options == 'function') {
callback = arguments[2];
options = arguments[1];
}
}
这不仅可以确保您始终拥有一个选项对象,而且在有人切换 callback
和 options
的参数时也能正常工作。因此,选项排在第二位还是最后并不重要。此外,也许更重要的是,源代码清楚地告诉了我们它的意图。