js中表达式 >>> 0 浅析

今天在看lodash的源码中slice这个函数实现的时候发现了里面有这么一行代码

length = start > end ? 0 : ((end - start) >>> 0)
start >>>= 0

当时就很疑惑,知道 >>是移位,那>>>又是什么鬼,还有移位0位又有什么意义呢,带着强烈的好奇心,我就去探究了一下 >>> 0它到底暗藏什么玄机。

  • >> 和 >>>有什么不一样

查了MDN原来>>>是无符号右移,>>是有符号移位,
>>有符号移位:该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧

-9 >> 2
11111111111111111111111111110111  // -9 -> 11111111111111111111111111111101   // -3

>>>无符号移位:该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(即便右移 0 个比特,结果也是非负的。

9 >>> 2
00000000000000000000000000001001   // 9 ->  00000000000000000000000000000010 // 2

根据文档说明即使移动0位也可以将一个负数变成正数,甚至也可以将一个小数变成整数,将未定义的值转换为0,那到底移动0位是什么意思。

  • 移位0有什么意义

查过一些资料,其中stackoverflow里面有一个高票回答,里面有这么一句话

It doesn‘t just convert non-Numbers to Number, it converts them to Numbers that can be expressed as 32-bit unsigned ints.

原来移位操作符在移位前做了两种转换,第一将不是number类型的数据转换为number,第二将number转换为无符号的32bit数据,也就是Uint32类型。这些与移位的位数无关,移位0位主要就是用了js的内部特性做了前两种转换。

  • Uint32类型是如何转换的

1 . 如果不能转换为Number,那就为0
2 . 如果为非整数,先转换为整数,参考公式sign(n) ⋅ floor(abs(n))

function ToInteger(x) {
    x = Number(x);
    return x < 0 ? Math.ceil(x) : Math.floor(x);
}

3 . 如果是正数,返回正数,如果是负数,返回负数 + 2的32次方

function modulo(a, b) {
    return a - Math.floor(a/b)*b;
}
function ToUint32(x) {
    return modulo(ToInteger(x), Math.pow(2, 32));
}原文:https://segmentfault.com/a/1190000014613703

原文地址:https://www.cnblogs.com/ckAng/p/10496329.html

时间: 2024-08-30 08:08:48

js中表达式 >>> 0 浅析的相关文章

js中使用0 “” null undefined需要注意

注意:在js中0为空(false) ,代表空的还有"",null ,undefined: 如果做判断if(!上面的四种值):返回均为false console.log(!null);// trueconsole.log(!0);//trueconsole.log(!"");// trueconsole.log(!undefined);// true console.log(0=="");//true console.log(0==" &

js中,0的判断

在js中,判断,往往是这样写的 let a; let b; a?b=a:b=-1; console.log(b); 这样写,a为null或者undefined时,没有问题. 可,a为0时(数字零),想打印出来b为0,可打印出来的是b=-1,为什么呢? 因为,在js中,if(0) 判断出来是false. 这时,就应该这样写了 let a=0; let b; (a===0 || a)?b=a:b=-1; console.log(b); 原文地址:https://www.cnblogs.com/ztg

js中奇特的for循环写法

//正常的for循环 for(var i=0;i<10;i++){ console.log(i); } //输出:1,2,3……10 //简写 for(var i=10;i--;){ console.log(i); } //输出:9,8,7,……0 //变种: for(var i=-10;i++;){ console.log(i*-1); } //输出:9,8,7,……0 因为在js中,0,null,undefined,false,'',""作为条件判断时,其结果为false i

js 中使用el表达式 关键总结:在js中使用el表达式一定要使用双引号

js 中使用el表达式 关键总结:在js中使用el表达式一定要加双引号 js控制中用到了el表达式,最开始源码如下: Java代码   var selected = ${requestScope.xxxxForm.recordNumPerPage} 这样始终js错误,因为在第一次的时候requestScope.xxxxForm.recordNumPerPage为null.于是在boss的指导下,简单的加了两个引号,代码变成 Java代码   var selected = "${requestSc

转:js中javascript:void(0) 真正含义

from:http://www.jb51.net/article/71532.htm 在Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. 我想使用过ajax的都常见这样的代码: 代码如下: <a href="javascript:doTest2();void(0);">here</a> 但这儿的void(0)究竟是何含义呢? void 操作符用法格式如下: 1. javascript:void (expression) 2.

js中 javascript:void(0)的含义

void(0)用于执行某些处理,但是不整体刷新页面的情况下, javascript:void(0)表示不做任何动作.如: <a href="javascript:void(0);" onclick="alert('ok');"></a> 这里表示这个链接不做跳转动作,执行onClick事件. 我想使用过ajax的都常见这样的代码: <a href="javascript:doTest2();void(0);">

浅析Vue.js 中的条件渲染指令

1 应用于单个元素 Vue.js 中的条件渲染指令可以根据表达式的值,来决定在 DOM 中是渲染还是销毁元素或组件. html: <div id="app"> <p v-if="type===1">拌面</p> <p v-else-if="type===2">扁肉</p> <p v-else="type===3">其它</p> </div

在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

//在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num, n) {//参数说明:num 要格式化的数字 n 保留小数位 num = String(num.toFixed(n)); var re = /(-?\d+)(\d{3})/; while (re.test(num)) num = num.replace(re, "$1,$2") ret

关于JS中涉及的常用类型转换及运算符表达式

JS中的常用类型转换(一般用强制转换):1.强制转为整数:parseInt:写法:x = parseInt(x); 2.强制转换位小为:parseFloat:写法:x = parseFloat(x); 3.检测类型:x = parseInt(x);       alert(typeof(true)); JS中常用的运算符表达式:1.逻辑运算符(布尔型):&& 并 :|| 或 :! 非 : 2.比较运算符:==(等于) :!=(不等于) : > :< :>=(大于等于) :