JavaScript二进制reduce函数:为什么16 + 0返回0?

时间:2016-09-22 02:34:00

标签: javascript binary ecmascript-6

我正在尝试创建一个接收8位二进制的函数,并为您提供总和。

我在执行num + num方面遇到了麻烦。

在我的reduce函数中,我创建了一个总和,并将二进制数字的值加起来:

const enumerableBinaryMap = {
    0: 128,
    1: 64,
    2: 32,
    3: 16,
    4: 8,
    5: 4,
    6: 2,
    7: 1
};

function sum (arr) {
    return arr.reduce((sum, val, index) => {
        return sum + val === 1 ? enumerableBinaryMap[index] : 0;
    }, 0);
}

sum([0, 0, 0, 1, 0, 0, 0, 1]); // 1, should be 17

当我到达二进制数组中的第一个1时,会出现问题。

例如,请看下面每个reducer调用的值:

  1. sum = 0,val = 0,index = 0
  2. sum = 0,val = 0,index = 1
  3. sum = 0,val = 0,index = 2
  4. sum = 0,val = 1,index = 3
  5. sum = 16,val = 0,index = 4
  6. sum = 0,val = 0,index = 5< --- BOOM!
  7. 正如您在上面所看到的,减速器中第5次调用的返回值是这里的罪魁祸首。为什么总和在第6次呼叫时等于0?它应该仍然是16因为我们返回16 + 0?

    我可以验证我的reduce工作的实现,因为下面的代码可以工作,而且它与我正在做的事情基本相同:

    [1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15
    

    任何人都知道发生了什么事?

1 个答案:

答案 0 :(得分:2)

问题是operator precedence。您显示的代码被解释为

return (((sum + val) === 1) ? enumerableBinaryMap[index] : 0);

而你想要

return (sum + ((val === 1) ? enumerableBinaryMap[index] : 0));
//            ^                                            ^

添加几个括号来修复它或使用

return val === 1 ? sum + enumerableBinaryMap[index] : sum;