【问题标题】:JS function declaration: curly brace object assigned with an empty object in parameter declarationJS函数声明:大括号对象在参数声明中分配了一个空对象
【发布时间】:2017-02-23 14:36:43
【问题描述】:

这是代码,

export function createConnect({
    connectHOC = connectAdvanced,
    mapStateToPropsFactories = defaultMapStateToPropsFactories,
    mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,
    mergePropsFactories = defaultMergePropsFactories,
    selectorFactory = defaultSelectorFactory
} = {}) {...}

函数参数声明中的 { connectHOC = connectAdvanced... } = {} 是什么意思?

我知道

= {}

可能是函数参数的默认值,但是前面的大括号里面的代码有什么用呢?

【问题讨论】:

  • 我还不完全确定,但第一部分 ({ connectHOC = ……… = defaultSelectorFactory }) 不是一个对象,它是一个包含多个变量声明的块。对象会使用冒号,而不是等号。
  • 它是参数默认值和解构的组合。令我们惊讶的是,我们似乎还没有在 SO 上同时涵盖这两个问题的问题,无论是那个还是我的谷歌这次都让我失望了。
  • This is close,但并不完全是骗子。 Also this。他们都解释了这里发生了什么,但从 OP 的角度来看,他们知道他们想要为解构参数分配默认值,而不是“这是什么语法”方法。
  • TL;DR: “...您可以定义一个默认值,这样您的函数就不必接受任何参数。”

标签: javascript


【解决方案1】:

这是 ES2015 语法。您的函数声明将 Destructuring assignment 与默认值结合在一起。

这是一个使用对象的基本解构赋值:

var {a, b} = {a: "foo", b: "bar"};
console.log(a); // "foo"
console.log(b); // "bar"

您可以在左侧添加默认值:

var {a = "foo", b = "bar"} = {};
console.log(a); // "foo"
console.log(b); // "bar"

在声明函数时命名参数时,不要使用var,并且与对象解构相同:

function test({a = "foo", b = "bar"}){
    console.log(a + b);
}
test({}); // "foobar"
test({b: "boo"}); // "fooboo"

当然,您可以定义一个默认值,这样您的函数就不必接受任何参数。

function test({a = "foo", b = "bar"} = {}){
    console.log(a + b);
}
test(); // "foobar"

【讨论】:

  • 不错的附加示例。
  • "...您可以定义一个默认值,这样您的函数就不必接受任何参数。"好的,最后的实际答案......
【解决方案2】:

这只是使用解构来处理默认参数的方式。您需要按照您的建议将最后一位作为默认设置。

考虑以下,与示例一样使用destructuring assignment

function withDefault({parameter=something} = {}) {
 console.log(parameter)
}

let something = 1;
withDefault();

相对于这个,它缺少默认值,并且会引发错误:

function withoutDefault({parameter=something}) {
 console.log(parameter)
}

let something = 1;
withoutDefault();
// It needs to be called as withoutDefault({}), withoutDefault(1) or
// with some value, since the function signature doesn't define a default
// in this case.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2013-03-22
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多