参数解构(相当于 python 的 double-splat)
Parameter destructuring (equivalent of python's double-splat)
在 python 中,我可以通过 **
(双拼)运算符传递其键与参数名称匹配的字典:
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);
奖金问题:为什么错误信息是"undefined is not a function"?这里未定义的到底是什么?
(正如@Nina Scholz 在评论中的回答,这是因为 ...
要求它的参数具有 Symbol.iterator
,这不是为对象定义的)。
您需要将 args
括在花括号中,然后再放在函数的参数列表中。
function foo({a, b}) {
console.log(a - b)
}
let args = {b: 7, a: 10}
foo({...args})
How to do the same in 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));
虽然我不敢在生产中使用它。
在 python 中,我可以通过 **
(双拼)运算符传递其键与参数名称匹配的字典:
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);
奖金问题:为什么错误信息是"undefined is not a function"?这里未定义的到底是什么?
(正如@Nina Scholz 在评论中的回答,这是因为 ...
要求它的参数具有 Symbol.iterator
,这不是为对象定义的)。
您需要将 args
括在花括号中,然后再放在函数的参数列表中。
function foo({a, b}) {
console.log(a - b)
}
let args = {b: 7, a: 10}
foo({...args})
How to do the same in 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));
虽然我不敢在生产中使用它。