在本文开始之前,我想给大家介绍几个话题
变量num1=1&0;
控制台.log(num1);//0
var num2='字符串'&1;
控制台.log(num2);//0
var num3=真&1;
控制台.log(num3);//1
var num4=未定义|假;
控制台.log(num4);//0
var num5=未定义|真;
控制台.log(num5);//1
var num6=23和5;
控制台.log(num6);//5
var num7=23 | 5;
控制台.log(num7);//23
以上问题你们都答对了吗?咱们之前总结了JavaScript中的“&&”和“|”;“&&”和“|”是逻辑运算表达式中的运算符。“&”或“|”是什么意思?有什么特点?接下来,让咱们逐个揭开机密。
首先,咱们须要弄清楚“&”和“|”是位运算符。
位运算符用于在最根本的级别上操作值,也就是说,由内存中示意值的位来操作。ECMAScript中的所有值都以IEEE-754 64位格局存储,但位运算符不间接对64位值进行操作。相同,首先将64位值转换为32位整数,而后执行该操作,最初将后果转换为64位。对于开发人员来说,因为64位存储格局是通明的,所以整个过程就像只有32位整数。
对于有符号整数,32位中的前31位用于示意整数的值。位32是值的符号:0是负数,1是正数。示意符号的位称为符号位。符号位的值决定其余位值的格局。负数以纯二进制格局存储,31位中的每一位示意2的幂。第一位(称为位0)示意20,第二位示意21,依此类推。未应用的位用0示意,0被疏忽。例如,值18的二进制示意是0000 00010010,或者更简洁地说是10010。这是五个无效位,用于确定理论值。
正数也存储在二进制代码中富拓跟单但应用的格局是二进制补码。计算值的二进制补码有三个步骤
(1) 求这个值的绝对值的二进制码(例如,求-18的二进制补码,先求18的二进制码);
(2) 求二进制逆码,即用1代替0,用0代替1;
(3) 在二进制反码中加1。
这样,取得-18的二进制示意,即1111 1111 1111 1111 1111 1110 1110。
... 在ECMAScript中,当一个位运算符利用于一个值时,在后盾会产生以下转换过程:将64位值转换为32位值,而后执行位操作,最初将32位后果转换回64位值。这样,看起来就像是在操纵32位值,就像在其余语言中以相似的形式执行二进制操作一样。但这种转换过程也会导致重大的副作用,即当对非凡的Nan和无穷大值利用位运算时,这两个值都将被视为0。
如果位运算符利用于非数值,则在利用位运算之前,将应用number()函数将值转换为数值(主动实现)。后果将是一个数值。。。(截取自JavaScript高级编程)
2、 “&”(按位AND和):”
按位and运算符由一个和字符(&)示意,它有两个运算符编号。实质上,按位与运算是将两个数值的每一位对齐,并对同一地位的两个数字执行与运算。
逐位and运算规定:只有两个数值对应的位都为1时,才返回1。如果任何位为0,后果将为0。
我谈了太多实践的货色,但我认为实践是必要的。接下来,让咱们间接剖析示例!
让咱们首先看看下面主题中的num1、num2、Num3和num6。咱们试图联合上述实践来剖析为什么最终的后果会被输入。
//Num1是按位“与”运算后1和0的返回值。1的二进制代码缩写为1,0的二进制代码缩写为0。根据上述规定,第二个运算符编号为0,后果为0
变量num1=1&0;
控制台.log(num1);//0
//第一个运算符编号是字符串。依据前言中的实践,对于非数字运算符,首先应用number()函数,后果返回Nan,将被视为0。所以最终后果是0
var num2='字符串'&1;
控制台.log(num2);//0
//True是一个布尔类型值,也由number()函数解决。通过解决,失去值1,因而该表达式相当于位运算的“1&1”。当两个值都为1时,后果返回1
var num3=真&1;
控制台.log(num3);//1
//23的二进制代码是。。。10111,5的二进制代码是。。。00101