Javascript Array.reduce和一个奇怪的错误

Javascript Array.reduce和一个奇怪的错误,javascript,node.js,Javascript,Node.js,当我读到关于Javascript Array.reduce函数的博客时,我遇到了一个问题,代码是: var res = str.split('') .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), pre), {}); 我不知道为什么箭头函数有两个返回表达式,换句话说,我认为应该是: var res = str.split('') .reduce((pre, cur) => (pre[cur

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

var res = str.split('')
         .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), pre), {});
我不知道为什么箭头函数有两个返回表达式,换句话说,我认为应该是:

var res = str.split('')
         .reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), {});
有什么区别? 然后,我尝试将函数重建为:

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;
     }, {});

这是逗号运算符。并且reduce函数需要返回结果(
pre
,在您的例子中)加上@Maxx所说的,
pre
的值被
数组中返回的值所操纵。如果不返回,
pre
不再是
对象。。使用
逗号运算符
,返回
逗号
后的最后一个值。我的意思是,箭头函数应该用作(param1,param2,…,paramN)=>表达式,为什么(pre[cur]++|(pre[cur]=1),pre)?两种表情?@Rayon@Maxx@Archsx
(pre[cur]+| |(pre[cur]=1),pre)
不是arrow函数的参数,而是它的主体。这是一个带有逗号运算符的表达式。coma运算符只计算它的每个操作数(从左到右)并返回last的值。我知道参数是pre和cur,但我仍然不知道如何使用Arrow函数,我认为应该只有一个表达式。无论如何,thx@MaxxThx,我以前不知道关于Arrow函数的这种方式。