编程语言
首页 > 编程语言> > javascript-参数解构(等效于python的double-splat)

javascript-参数解构(等效于python的double-splat)

作者:互联网

python中,我可以传递一个dict(其键与参数的名称匹配)并使用**(double-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,该对象未为对象定义).

解决方法:

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));

我不敢在生产中使用它.

标签:destructuring,javascript,ecmascript-6,double-splat
来源: https://codeday.me/bug/20191011/1891499.html