【问题标题】:JS reduce() method syntax understanding [duplicate]JS reduce() 方法语法理解
【发布时间】:2018-05-09 19:42:01
【问题描述】:

我有以下两个可以在任何浏览器上运行的代码。

代码1:

let prices = [1, 2, 3, 4, 5];
let result = prices.reduce( (x,y)=>{x+y} ); // Reduce data from x to y.
console.log(result);

代码2:

let prices = [1, 2, 3, 4, 5];
let result = prices.reduce( (x,y)=>x+y ); // Reduce data from x to y.
console.log(result);

第一个代码不起作用,但第二个代码起作用。

为什么大括号 ({}) 会使其不起作用?它们不是隐式函数的一部分吗?或者这种 braceless 语法只是 reduce() 方法的独特之处?

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

在第一个中缺少return 语句:

let prices = [1, 2, 3, 4, 5];
let result = prices.reduce( (x,y)=>{return x+y;} ); // Reduce data from x to y.
console.log(result);

在第二个示例中,return 是隐式的。

【讨论】:

  • 嗯,很有趣。为什么我们首先需要显式版本中的return?我很少在 JS 中使用return,只有当我想在其范围内的某个位置停止一个函数,然后继续我的代码的下一部分时。
  • 因为reduce 函数需要它。在每次迭代中,您都需要返回下一个累加器,它将成为下一次迭代的第一个参数。
【解决方案2】:

第一个不起作用,因为存在 {}。在 ES6 中,如果=> 之后的下一个内容没有{},则=> 可以替代return 关键字。

如果在=> 之后提供{},您需要明确使用return 关键字。

在代码 1 中,您需要稍作修改,如下所示:

let prices = [1, 2, 3, 4, 5];
let result = prices.reduce( (x, y) => { return x + y }); // Note the return keyword
console.log(result);

【讨论】:

    【解决方案3】:

    第二个示例有效,因为 没有 大括号,x+y 被隐式返回。如果包含大括号,则必须显式返回值,例如{return x+y}

    【讨论】:

    • 真正的悲剧是() => {}没有返回对象。
    • 问题是大括号被重载了——它们既可以用于函数体,也可以用于对象字面量。仅对于箭头函数,它们必须被解释为函数体才有意义,因为并非所有箭头函数都只会返回一个值,但也可能包含其他语句。
    • 我投了赞成票。我只是在发表评论