Array.reduce和一个奇怪的错误

当我阅读有关Javascript Array.reduce函数的博客时,我遇到了一个问题,代码是:

var res = str.split('') .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), pre), {}); 

我不知道为什么箭头函数有两个returnexpression式,换句话说,我认为应该是:

 var res = str.split('') .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), {}); 

有什么不同? 然后我尝试重build该函数为:

 var res = str.split('') .reduce(function(pre,cur){ console.log(pre) ; console.log(cur) ; if( pre[cur] === 1) { pre[cur]++; } else pre[cur] = 1; }, {}); 

但我再次得到错误,错误是如此怪异!!!:

  if( pre[cur] === 1) ^ 

TypeError:无法读取未定义的属性“d”

什么? 财产'd'?

你能回答我的两个问题吗?

这个

 var res = str.split('') .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), pre), {}); 

等于

 var res = str.split('') .reduce(function(pre, cur){ if (!pre[cur]++) { pre[cur] = 1; } return pre; }, {});