Javascript减少速记不返回对象

Javascript减少速记不返回对象,javascript,ecmascript-6,Javascript,Ecmascript 6,为什么一个能工作而另一个不行 const b = { age: 20, name: "John Doe" } const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => acc[key] = val,{}); 输出:John Doe 顶部省略了表示自动返回acc的块括号。 底部是使用大括号,这意味着您必须手动返回acc const sortedB = Object.entries(b).sort(

为什么一个能工作而另一个不行

const b = {
  age: 20,
  name: "John Doe"
}

const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => acc[key] = val,{});
输出:John Doe

顶部省略了表示自动返回acc的块括号。 底部是使用大括号,这意味着您必须手动返回acc

  const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => {
    acc[key] = val;
    return acc;
  },{});
输出:{age:20,name:“John Doe”}

顶部省略了表示自动返回acc的块括号

不,不是这个意思。JavaScript应该如何/为什么知道返回
acc

如果有一个箭头函数,其中只有一个表达式作为主体,则返回该表达式的结果。赋值的结果就是被赋值的值。例如:

var func=()=>1;
console.log(func());//1.
func=x=>x;
console.log(func(42))//42
func=(x,y)=>y=42;
console.log(func(1,2));//42
func=x=>(x,42);
console.log(func(21));//42
func=x=>(42,x);

console.log(func(21));//21
正如在另一个答案中已经解释的那样,
acc[key]=val
表达式无法自动返回acc,因为它的计算结果是
val
,而不是
acc

ES6中的
reduce
函数可以方便地使用的配方是
Object.assign
,因为它返回一个扩展的对象:

Object.entries(b).sort().reduce((acc, [key, val]) => Object.assign(acc, { [key]: val }) ,{});

它比
acc[key]=val更昂贵;return acc
,但可以在非关键位置使用(在性能关键位置
对象中。也不欢迎使用条目
reduce
),并且可以与隐含的箭头返回一起使用。

您甚至可以在
ES6
中使用短版本:

Object.entries(b).sort().reduce((acc, [key, val]) => ({ ...acc, ...{ [key]: val } }),{});

这是一个聪明的逗号操作符用例,谢谢!当你使用它的时候,你觉得代码的可读性怎么样?好问题。我认为逗号运算符是一种不常用的运算符,因此了解它及其工作原理的人可能会更少。从这个角度来看,可读性可能会受到影响。