【问题标题】:Destructing optional function parameters解构可选函数参数
【发布时间】:2019-02-22 22:34:13
【问题描述】:

挠头试图达到最佳状态。假设我有一个函数,它将一个对象作为参数并像这样破坏它:

myfunc = (options = {a:true, b:true, c:true}) => {...}

默认情况下 a b 和 c 为真。但假设我打电话给myfunc 并希望 b 为假:

myfunc({b:false})

现在好了options.b === false,但是 a 和 c 的值已经消失了。 有没有我可以在不传递默认值副本的情况下完成此操作?

我尝试了一些奇怪的东西,比如

myfunc = (options = Object.assign({a:true, b:true, c:true}, options)) =>{}

但这肯定不对。

【问题讨论】:

    标签: javascript ecmascript-6 destructuring


    【解决方案1】:

    您可以使用带有默认值的所需属性解构的默认对象,而无需使用option。然后使用速记属性创建一个新的。

    对于其他对象,您可以使用 newer 或 babeljs 对象的 rest 属性。

    var myfunc = ({ a = true, b = true, c = true, ...rest } = {}) => {
            const option = { a, b, c, ...rest };
            console.log(option);
        };
    
    myfunc();             // take {} as default and the default values inside of the object
    myfunc({ b: false }); // take b and default values
    myfunc({ foo: 42 });  // take foo and all default values
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 这很酷,但我需要将它包含在单个 option 中。我最终可能会传递不包含在默认值中的值。
    • @SpeedOfRound 使用 ES2018 对象剩余语法来包含其余值:{ a = true, b = true, c = true, ...values } = {}
    • 太棒了,正是我想要的。为什么参数必须分配给一个空对象?我不明白这里发生了什么
    • 如果函数被调用时没有值或undefined,则需要一个对象(用于解构)。那么你需要为想要的属性销毁其他默认值来获取想要的变量。
    【解决方案2】:

    你可以在解构语句中传递默认值:

    myFunc = ({a=true, b=true, c=true})
    

    缺点显然是无法将选项作为一个整体来引用。 所以也许将options 作为参数并在函数体中进行解构是更好的选择:

    myfunc = (options={}) => {
        const {a=true, b=true, c=true} = options;
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2023-04-04
      • 2016-11-26
      • 2019-10-02
      • 2021-03-12
      • 2023-01-31
      • 2012-10-15
      相关资源
      最近更新 更多