发现问题
在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。
网友评论