【问题标题】:Destructuring Default Properties解构默认属性
【发布时间】:2016-03-07 15:57:17
【问题描述】:

我使用的是默认参数,有这个功能:

function defaultstest({ test = { done: false, test: true }, done = false } = {}) {
 console.log(test, done)
}

如果我将其称为defaultstest()defaultstest({})defaultstest({ done: true }),则默认设置正确。

但是当我向测试对象添加一个属性时,其他的都没有设置为默认值。

defaultstest({ test: { done: true } }) >> { done: true } false

如何确保将可选属性设置为默认值?

【问题讨论】:

  • 同时使用 testdone 两次完全不同对象的属性名称令人困惑。我什至不知道你是故意这样做还是自己弄糊涂了。哪些输入的预期输出是什么?

标签: javascript ecmascript-6 default-parameters destructuring


【解决方案1】:

您不能提供嵌套的默认参数。在您的示例中,如果您提供测试,那么它不会被分配给您提供的属性值测试和完成的默认对象。

仅当没有值或未定义传递给函数时才提供默认值:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters

您可以使用 Object.assign (ES6) 或扩展函数来完成此操作:

function defaultstest(test = {}, done = false ) {
  test = Object.assign({done: false, test: true}, test); 
  console.log(test, done)
}

否则你将需要平息你的论点。

如果你使用 babel 将其转译为 ES5 代码,可能会变得更加清晰:

function defaultstest() {
  var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];

  var _ref$test = _ref.test;
  var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
  var _ref$done = _ref.done;
  var done = _ref$done === undefined ? false : _ref$done;

  console.log(test, done);
}

具体来说,注意 test 和 done 的分配:

var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
var done = _ref$done === undefined ? false : _ref$done;

【讨论】:

    【解决方案2】:

    在 ES6/ES2015 中没有嵌套默认参数的选项。查看下面的转译源代码。

    function defaultstest() {
      var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
    
      var _ref$test = _ref.test;
      var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
      var _ref$done = _ref.done;
      var done = _ref$done === undefined ? false : _ref$done;
    
      console.log(test, done);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多