为什么括号在创建 JavaScript 对象的 .reduce() 语法中起着作用?

Why are the role of the parentheses in this .reduce() syntax which creates a JavaScript object?

下面的代码展示了 JavaScript .reduce() 的三种用法:

  1. 加起来
  2. 建立数组
  3. 构建一个 JavaScript 对象

如何理解第三个例子中大括号周围添加的括号?它们就在那里,这样对象大括号就不会被解释为函数大括号吗?还是他们有其他目的?

是否有另一种方式来编写第三个示例,以便该语法更明确,例如能否以某种方式在多行函数中构建 JavaScript 对象?

const languages = ['french', 'french', 'spanish', 'polish', 'spanish', 'german', 'spanish', 'polish', 'spanish', 'spanish', 'french', 'spanish', 'english', 'french', 'spanish', 'english', 'french', 'english'];

// 1. iterating while adding a sum
const sum = languages.reduce((acc, language) => {
    acc++;
    return acc;
}, 0);
console.log(`There are ${sum} entries.`);

// 2. iterating while building an array
const initials = languages.reduce((acc, language) => {
    acc.push(language.substring(0, 1));
    return acc;
}, []);
console.log(initials);

// 3. iterating while building a JavaScript object
const totals = languages.reduce((acc, language) => ({
    ...acc,
    [language]: acc[language] ? acc[language] + 1 : 1
}), {});
console.log(totals);

是的,它们的存在是为了防止括号被读作函数大括号,因为:

.reduce((acc,language) => acc)

如果没有大括号,箭头函数将 return 右边是什么。它相当于这里:

.reduce((acc,language) => { return acc })

如果你想 return 一个对象 {} 你不能简单地使用大括号,它们会被解释为函数大括号,所以你需要将它们括在括号中

.reduce((acc,language) => ({...acc})

这相当于:

.reduce((acc,langauge) => {
   return {...acc};
})