《Eloquent JavaScript》第四章:tableFor函数中index +=2的逻辑疑问
为什么这段代码里要使用
index +=2? 嘿,这个问题问得特别好!咱们一步步拆解这段代码的逻辑,就能明白index +=2的作用啦~
首先,这段代码里的table是一个4元素的数组,它其实是用来统计「目标事件(比如吃披萨)」和「结果(变成松鼠)」的四种组合情况,对应的关系是:
table[0]:既没发生目标事件,也没变成松鼠的次数table[1]:发生了目标事件,但没变成松鼠的次数table[2]:没发生目标事件,但变成了松鼠的次数table[3]:既发生了目标事件,又变成了松鼠的次数
接下来看index的计算逻辑:
- 初始
index = 0,对应「无事件、无松鼠」的场景 - 如果
entry.events.includes(event)(目标事件发生了),就index +=1——这相当于把索引切换到「有事件」的分组(从0→1,2→3) - 如果
entry.squirrel(变成松鼠了),就index +=2——这相当于把索引切换到「有松鼠」的分组(从0→2,1→3)
你看,这两个操作刚好把两个布尔条件的四种组合,映射成了0-3四个唯一的索引:
| 事件发生? | 变成松鼠? | index值 | 对应table位置 |
|---|---|---|---|
| 否 | 否 | 0 | table[0] |
| 是 | 否 | 1 | table[1] |
| 否 | 是 | 2 | table[2] |
| 是 | 是 | 3 | table[3] |
结合你输出的结果[76, 9, 4, 1]来理解:
- 76次:没吃披萨也没变成松鼠
- 9次:吃了披萨但没变成松鼠
- 4次:没吃披萨但变成松鼠
- 1次:吃了披萨且变成松鼠
简单来说,index +=2是用「二进制位」的思路,把「是否变成松鼠」这个条件作为高位,和「是否发生事件」的低位组合,生成唯一的索引,从而用一个一维数组就能高效统计四种场景的次数,是不是很巧妙?
内容的提问来源于stack exchange,提问作者Kamil Staszewski
相关产品推荐
相关产品推荐

