美文网首页
lodash源码——x >>> 0 解析

lodash源码——x >>> 0 解析

作者: 前端路上的小兵 | 来源:发表于2019-02-20 23:39 被阅读0次
    发现问题

    在lodash源码中有下列这么一段代码

    function slice(array, start, end) {
      let length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      start = start == null ? 0 : start;
      end = end === undefined ? length : end;
      if (start < 0) {
        start = -start > length ? 0 : length + start;
      }
      end = end > length ? length : end;
      if (end < 0) {
        end += length;
      }
      length = start > end ? 0 : (end - start) >>> 0;
      start >>>= 0;
      let index = -1;
      const result = new Array(length);
      while (++index < length) {
        result[index] = array[index + start];
      }
      return result;
    }
    

    重点分析
    length = start > end ? 0 : (end - start) >>> 0;
    start >>>= 0;
    这里 >>> 的作用是什么呢?这么做的意义是什么呢?

    解析

    在MDN中:>>>是无符号右移,>>是有符号移位

    >>有符号移位:该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,
    拷贝最左侧的位以填充左侧
    
    -9 >> 2
    11111111111111111111111111110111  // -9
     ->  11111111111111111111111111111101   // -3
    
    >>>无符号移位:该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充
    因为符号位变成了 0,所以结果总是非负的。(即便右移 0 个比特,结果也是非负的。)
    
    9 >>> 2
    00000000000000000000000000001001   // 9 
    ->  00000000000000000000000000000010 // 2
    
    根据文档说明即使移动0位也可以将一个负数变成正数,甚至也可以将一个小数变成整数,将未定义的值
    转换为0,那到底移动0位是什么意思。
    
    x >>> 0的意义

    x >>> 0本质上就是保证x有意义(为数字类型),且为正整数,在有效的数组范围内(0 ~ 0xFFFFFFFF),且在无意义的情况下缺省值为0。

    参考网址

    js中表达式 >>> 0 浅析

    相关文章

      网友评论

          本文标题:lodash源码——x >>> 0 解析

          本文链接:https://www.haomeiwen.com/subject/ragfeqtx.html