Javascript es6对象或其他参数解构

Javascript es6对象或其他参数解构,javascript,destructuring,Javascript,Destructuring,让我们假设我有一个函数,我希望能够以两种方式使用它: movePoint("pointName", 32, 25) 或 在过去,我只会检查第一个参数是否是字符串,如果是;将其视为用户输入了第一种格式;如果不是,我假设它是一个对象,并直接使用它 问题 我们是否可以使用es6魔法实现这种行为。如果我为第一个案例编码,我有: function movePoint (name, x, y) 对于第二种情况,我将使用: function movePoint ({name, x, y, otherRar

让我们假设我有一个函数,我希望能够以两种方式使用它:

movePoint("pointName", 32, 25)

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

问题 我们是否可以使用es6魔法实现这种行为。如果我为第一个案例编码,我有:

function movePoint (name, x, y)
对于第二种情况,我将使用:

function movePoint ({name, x, y, otherRarelyUsedParameter=true})
是保留第二种语法的任何方法,同时也允许第一个参数为字符串


如果答案是否定的,你有什么建议来实现这一点的最具可读性的方法吗?

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

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}) {
    …
}

这里有两个逻辑,一个是检测输入类型的逻辑,另一个是移动一个点的逻辑。这最好通过两个功能来处理:

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

即使有办法,你不担心你会把这些逻辑塞进论点里吗?对我来说,这听起来像是一种不可读/不理想的方法,只是为了使用新的语言功能而让事情变得更混乱。是的,我想我也会这么做。我只是想用一种更易于维护的方式来实现它:P如果我最终得到一个包含30多个函数的库,那么它就会变得难以控制。如果我没有得到任何其他聪明的答案,我将继续并更正这个问题:请注意,当其中一个参数是长度或某个传递的字符串属性时,解构将失败。@user2662833,特别是如果您有这么多函数,您可能应该动态地生成包装器函数。您能详细说明一下吗?我不知道你说的是什么意思。
function movePoint({ name = arguments[0], x = arguments[1], y = arguments[2] }) {
    // Do function work with (name, x, y)
    console.log({ name, x, y });
}