为什么下面的函数执行 `greet({ name = 'Rauno' } = {})` 而不是 `greet(name = 'Rauno')`?

Why is the following function doing `greet({ name = 'Rauno' } = {})` instead of `greet(name = 'Rauno')`?

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

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

在给定的代码块中,greet 函数接受一个 属性 为“name”的对象。查看调用的外观:greet({ name: 'Larry' }) // Hi Larry!

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

那样调用它

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

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

greet(); // throws reference error

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