【问题标题】:Why is the following function doing `greet({ name = 'Rauno' } = {})` instead of `greet(name = 'Rauno')`?为什么下面的函数执行 `greet({ name = 'Rauno' } = {})` 而不是 `greet(name = 'Rauno')`?
【发布时间】:2020-11-18 16:09:56
【问题描述】:
function greet({ name = 'Rauno' } = {}) {
  console.log(`Hi ${name}!`);
}
 
greet() // Hi Rauno!
greet({ name: 'Larry' }) // Hi Larry!

虽然,我了解这里的基本功能...我不明白需要做什么 greet({ name = 'Rauno' } = {}) 而不是 greet(name = 'Rauno')。他们不是达到同样的结果吗?那么,为什么?

【问题讨论】:

  • 它是关于默认参数值和对象解构的混合体

标签: javascript object ecmascript-6 default-value


【解决方案1】:

简短的回答是否定的。
假设你有你的函数并像下面这样调用它:

function greet({ name = 'Rauno' }) {
  console.log(`Hi ${name}!`);
}

greet(); // throws reference error

你没有传递任何东西(隐式undefined)作为第一个参数。因此,当 javascript 尝试访问 undefined.name 并引发引用错误时,它会失败。因为undefined 不是对象,也没有名称属性。所以你应该为参数设置一个默认值来覆盖undefined case。然后javascript尝试检索{}.name,它是undefined,并检索名称的默认值(在您的情况下为Rauno)。

【讨论】:

    【解决方案2】:

    在给定的代码块中,greet 函数接受具有“名称”属性的对象。看看电话的样子:greet({ name: 'Larry' }) // Hi Larry!

    如果您编写 function greet(name = "Rauno") { /***/ },该函数将接受单个字符串参数,因此您可以像 greet("@Grateful"); 一样调用它

    【讨论】:

    • 非常感谢您的回答,它确实帮助我更好地理解了其他答案。很遗憾,我无法选择多个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2022-12-07
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多