关于mitt源码中.splice( x >>>0,1)语句的含义

78 阅读1分钟

看mitt源码的时候,看到一行语句颇有意思,如下:

后来想了一下,这种处理方式相当于以下代码

const idx = handlers.indexOf(handler);

if(idx >= 0){
    handlers.splice(idx,1);
} 

好处是代码简单,又避免了处理indexOf查找不到元素后返回-1的分支逻辑。 splice(-1,1)操作是删除最后一个元素。 

“>>>”运算符是无符号右移的位操作,对于操作数为正数,没有任何变化。但对于负数则相当于处理成一个很大的数( -1>>>0 = 4294967295)。splice对于超出数组长度的位置不做处理。

虽然js 数字以64位存储,但是位操作需要转换成32位,-1 就变成了 1 000000000...(31个0),以反码表示为 1111111...,32个1。无符号处理,第一个符号位变成了数据位,32个1的正整数就是4294967295。

当然,一个潜在的bug就是,极端情况下万一handlers数组里真的有超过4294967295个元素时就有问题了。(内存没爆?)