es6对象或其他参数解构

时间:2018-01-27 10:11:00

标签: javascript destructuring

让我假装我有一个我希望能够以两种方式使用的功能:

movePoint("pointName", 32, 25)

或者

movePoint({
    name: "pointName",
    x: 32,
    y: 25,
    otherRarelyUsedParameter: true,
})

在过去,我只会检查第一个参数是否为字符串,如果是,对待它好像用户输入了第一种格式;如果没有,我会假设它是一个对象并直接使用它。

问题

我们能否使用任何es6魔法来实现这种行为。如果我为第一个案例编码:

function movePoint (name, x, y)

对于第二种情况,我会使用:

function movePoint ({name, x, y, otherRarelyUsedParameter=true})

是否可以保留第二种语法,同时也允许第一个参数为字符串。

如果答案是否定的,您是否对实施此方法最可读的方法有任何建议?

2 个答案:

答案 0 :(得分:3)

我认为你真的不应该像这样使用重载。但是当你这样做时,编写第二个函数可能是最简单的解决方案:

function movePoint (o, x, y) {
    if (typeof o == "string")
        return _movePoint({name: o, x, y});
    else
        return _movePoint(o);
}

function _movePoint ({name, x, y, otherRarelyUsedParameter=true}) {
    …
}

答案 1 :(得分:1)

这里有两条逻辑,检测输入类型的逻辑和移动点的逻辑。最好用两个函数来处理:

function movePoint(nameOrSpec, x, y) {
    if (typeof nameOrSpec === "string") {
        return movePointInternal({
            name: nameOrSpec,
            x,
            y
        });
    } else {
        return movePointInternal(nameOrSpec);
    }
}

function movePointInternal({ name, x, y }) {
    // Do whatever the function needs to do
}

使用一个函数和解构可以做到这一点,但在我看来它不是首选的选项:

function movePoint({ name = arguments[0], x = arguments[1], y = arguments[2] }) {
    // Do function work with (name, x, y)
    console.log({ name, x, y });
}