为什么以下函数使用 `greet({ name = 'Rauno' } = {})` 而不是 `greet(name = 'Rauno')`?

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

虽然我理解基本功能...但我不明白为什么需要执行greet({ name = 'Rauno' } = {})而不是greet(name = 'Rauno')。他们不是实现同样的结果吗?那么,为什么?


3
好的,这是关于默认参数值和对象解构的混合内容。 - bill.gates
2个回答

3
简短回答是不行的。
假设你有一个函数并像下面一样调用它:
function greet({ name = 'Rauno' }) {
  console.log(`Hi ${name}!`);
}

greet(); // throws reference error

你未显式传递第一个参数,而是隐含地将其传递为 undefined。所以当 JavaScript 尝试访问 undefined.name 时,它会失败并抛出引用错误。因为 undefined 不是一个对象,也没有名字属性。所以你应该设置参数的默认值来覆盖 undefined 的情况。然后 JavaScript 尝试检索 {}.name,结果是 undefined,并且默认的名字值被检索(在你的情况下是 Rauno)。


1
在给定的代码块中,greet 函数接受一个带有 "name" 属性的对象。看一下调用的样子:greet({ name: 'Larry' }) // Hi Larry! 如果你编写了 function greet(name = "Rauno") { /***/ },那么该函数将接受一个字符串参数,你可以像这样调用它:greet("@Grateful");

1
非常感谢您的回答,它确实帮助我更好地理解其他答案。不幸的是,我没有选择多个答案的能力。 - Grateful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接