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

2019-02-20  本文已影响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 浅析

上一篇下一篇

猜你喜欢

热点阅读