js中表达式 >>> 0 浅析

更新日期: 2019-03-09阅读: 2.7k标签: 表达式

今天在看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://fly63.com/article/detial/2290

你真的理解==和===吗?

要想回答上述问题,必须理解js在执行==时候的一些数据转换规则和成文的规定。ECMA-262对==的约定如下,细心的你发现上面ToNumber对于Object的转换里有这么一句ToPrimitive(input argument, hint Number)

什么是后缀表达式?

后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。

js中两个表达式运算结果的解析: []==![] 和{}==!{}

[]==![] 感叹号!的优先级最高,因此先计算![], 其结果为 false, 所以表达式被转换成: []==false.遇到Boolean类型,需要先转换成Number类型,所以表达是变成 []==0,0是基础类型,[]是引用类型

js正则表达式之解决html解析<>标签问题

以博客写文章为例,有的时候我们不经意间写的字符串带标签,然后浏览器将其解析了,实际上我们并不希望其被解析,于是可通过核心代码解决该问题。

JS三元表达式

三元表达式怎么用?三元表达式怎么就有用了?代码量会减少这是事实,配合箭头函数写函数式代码,哪个更易读这个就是主观判断了,见仁见智:

JS基础语法:分支语句之三元表达式

三元表达式,语法:* var 变量=表达式1?表达式2:表达式3;* 执行过程:* 表达式1的结果是true还是false,如果是true则执行表达式2,然后把结果给变量

20个稀奇古怪的 JavaScript 表达式,你要挑战回答一下嘛

JavaScript是一种非常容错的编程语言,许多在其他编程语言中不合法的表达式在JavaScript中都能正常工作。这导致了很多奇怪的代码。你想挑战它吗?

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!