js中表达式 >>> 0 浅析
zepto源码的Array.prototype.reduce有一行
当时就很疑惑,知道 >>是移位,那>>>又是什么鬼,还有移位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));
}
------------------------------------------------------------------
js中表达式 >>> 0 浅析的更多相关文章
- js中表达式 >>> 0 浅析 (以及用php简单翻译)
今天在看lodash的源码中slice这个函数实现的时候发现了里面有这么一行代码 length = start > end ? 0 : ((end - start) >>> 0 ...
- js中的0就是false,非0就是true及案例
在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...
- js中使用0 “” null undefined {}需要注意
注意:在js中0为空(false) ,代表空的还有“”,null ,undefined: 如果做判断if(!上面的四种值):返回均为false console.log(!null);// true c ...
- js中的0就是false,非0就是true。
在处理js代码判断真假时经常会这么写. var vale = fun();//从某个地方获取的值. if(!value){ 进入这里表示value为false或不存在 }但fun()可能得到的是数字0 ...
- JS中void(0)的含义
看别人些的JavaScript脚本可以看到这样的代码: <a href="javascript:doTest2();void(0);">here</a> 但 ...
- JS中void(0)操作符的使用
今天 在看源码时,发现这种写法 if(value === void(0)){ // } 以前没有见过这种写法,感觉就是判断一个变量是否有值,官网上是这样说的: void运算符 对给定的表达式进行求值, ...
- 如何更好的理解js中的this,分享2段有意思的代码
关于js中this的浅析,大家可以点击[彻底理解js中this的指向,不必硬背]这篇博客了解. 今天遇到2段比较有意思的代码. ----------------第一段----------------- ...
- js中奇特的for循环写法
//正常的for循环 for(var i=0;i<10;i++){ console.log(i); } //输出:1,2,3……10 //简写 for(var i=10;i--;){ conso ...
- js 中使用el表达式 关键总结:在js中使用el表达式一定要使用双引号
js 中使用el表达式 关键总结:在js中使用el表达式一定要加双引号 js控制中用到了el表达式,最开始源码如下: var selected = ${requestScope.xxxxForm.re ...
随机推荐
- 5.05-requests_cookies2
import requests # 请求数据url member_url = 'https://www.yaozh.com/member/' headers = { 'User-Agent': 'Mo ...
- bak
一.基础篇JVMJVM内存结构堆.栈.方法区.直接内存.堆和栈区别Java内存模型内存可见性.重排序.顺序一致性.volatile.锁.final垃圾回收内存分配策略.垃圾收集器(G1).GC算法.G ...
- (4)HomeAssistant 自动化
https://www.home-assistant.io/docs/automation/ 触发器,条件和动作. (trigger) When Paulus arrives home (condit ...
- linux7 udev的生效
这篇文章主要介绍在Oracle Linux 7中如何使用udev来设置用户自定义的设备名.在Oracle Linux 7 中的设置方法与之前的Linux版本有较大差别. 下面的例子的对/dev/sdb ...
- Spring Security(二十四):6.6 The Authentication Manager and the Namespace
The main interface which provides authentication services in Spring Security is the AuthenticationMa ...
- binarySearch(int[] a,int fromIndex,int toIndex, int key)的用法
package com.Summer_0420.cn; import java.util.Arrays; /** * @author Summer * binarySearch(int[] a,int ...
- # 20175329 2018-2019-2 《Java程序设计》第一周学习总结
教材学习内容总结 ·通过教材学习了如何安装JAVA ·在安装JAVA后对其环境变量的设置 ·第一次接触并手打出JAVA语言## 教材学习中的问题和解决过程- 问题1:在环境变量设置中不懂path cl ...
- linux内存源码分析 - 内存压缩(实现流程)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请 ...
- lambda从入门到精通
JDK8中包含了许多内建的Java中常用到函数接口,比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上. name ...
- 热泪盈眶的五十岁 | James Altucher
我是一名程序员,但我不爱看技术博客,因为要吸取知识点,看源代码.官方文档和书永远比看技术博客要好.对于博客这种偏碎片的媒介,我倾向于看一些短小精炼.有一点深度的叙述,Altucher刚好符我目前的品味 ...