参数解构(相当于python的双splat)



在python中,我可以传递一个字典,其键与参数名称与**(双splat(运算符匹配:

def foo(a, b):
print (a - b)
args = {'b': 7, 'a': 10}
foo(**args) # prints 3

如何在 ES6 中做同样的事情?这不起作用:

function foo(a, b) {
console.log(a - b)
}
args = {b: 7, a: 10}
foo(...args)

注意:我正在寻找一种不涉及更改foo签名的解决方案,因为我希望它以任何一种方式使用(有和没有解构(。因此,以下内容应该有效:

foo(<magic>args);
foo(123, 456);

奖励问题:为什么错误消息"未定义不是函数"?这里到底有什么未定义的?

(正如@Nina Scholz在评论中回答的那样,这是因为...要求其参数具有Symbol.iterator,而 ,而 不是为对象定义的(。

如何在 ES6 中做同样的事情?

JS中没有命名参数,只有位置参数。所以答案是:你不能。

您可以做的是通过对象传递模拟命名参数,如@Andy建议的那样。

function foo({ a, b }) {
console.log(a - b);
}
let args = { b: 7, a: 10 };
foo(args);

或者你可以args做一个数组,这样你就可以把它析构成位置参数。

function foo(a, b) {
console.log(a - b);
}
let args = [10, 7];
foo(...args);

好吧-好吧,只是为了论证:可以编写一个函数,该函数将提取foo参数并按所需顺序生成args的属性。

function * yolo(args, fn) {
const names = fn.toString().match(/(.+)/)[0]
.slice(1, -1).split(',')
.map(x => x.trim());
while (names.length) {
yield args[names.shift()];
}
}
function foo(a, b) {
console.log(a - b);
}
const args = { b: 7, a: 10 };
foo(...yolo(args, foo));

不过,我不敢在生产中使用它。

您需要将args括在大括号中,并再次在函数的参数列表中。

function foo({a, b}) {
console.log(a - b)
}
let args = {b: 7, a: 10}
foo({...args})

相关内容

  • 没有找到相关文章

最新更新