javascript - 参数解构(相当于python的double-splat)

标签 javascript ecmascript-6 destructuring 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,这不是为对象定义的) .

最佳答案

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

虽然我不敢在生产中使用它。

关于javascript - 参数解构(相当于python的double-splat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735576/

相关文章:

JavaScript SVG 旋转未按预期工作

javascript - 通过路径名中的变量名访问 map

javascript - 滚动到顶部 React 不适用于 Reactdom 的 findDOMNODE

Clojure : "java.lang.IllegalArgumentException: No value supplied for key:" when I changed require

javascript - 谷歌地图 API : Place marker at current map location

javascript - 在 AngularJS 中执行 $http.post 查询后返回 2 个表

javascript - 如何访问 Web 组件上的 observedAttributes

javascript - React.js 将 prop 状态从兄弟转移到另一个兄弟?

javascript - 如何将无状态组件(react)中具有默认值的 props 解构为变量,并在 JSX 中对该变量应用扩展运算符?

rust - 是否可以在函数声明中解构具有无可辩驳模式的元组?