上一篇文章呢,我们讲述了JavaScript运算符中的关系运算符和逻辑运算符,那么紧接上一篇的文章我们今天来说说逻辑运算符。
引言
逻辑运算符不是很难,也不是很多,我们只要记住三个就可以啦!分别是:
- ! 逻辑非
- && 逻辑与
- || 逻辑或
跟我们上初中判断命题的真假一样,返回的结果无异于真“或”者“假”,原理上都是一样的,还有没有小伙伴记得啊?如下图:
JavaScript逻辑运算符也是一样的,我们先看看下图:
其中expr可能是任何一种类型, 不一定是布尔值
逻辑非(!)
简单说就是不是(not)的意思,符合双重否定变肯定的旨意。
//给定 x=6 以及 y=3!(x==y) 为 true
规则:
- 如果一个操作数是一个对象,返回false。
- 如果一个操作数是一个空字符串,返回false。
- 如果一个操作数是一个非空字符串,返回false。
- 如果一个操作数是一个数值0,返回true。
- 如果一个操作数是任意的非零字符,返回false。
- 如果一个操作数是null,返回true。
- 如果一个操作数是NaN,返回true。
- 如果一个操作数是undefined,返回true。
特性:
1、如果运算数的值为false,则返回true,否则返回false。
2、连续使用两次,可将任意类型转化为布尔型值。
逻辑与(&&)
简单说就是和(and)的意思。
//给定 x=6 以及 y=3(x < 10 && y > 1) 为 true
规则:
- 第一个操作数是对象,则返回该对象。
- 第二个操作数是对象,第一个操作数值为true是返回该对象。
- 两个操作数都是对象,则返回第二个操作数。
- 一个操作数是NULL,返回NULL。
- 一个操作数是NaN,返回NaN。
- 一个操作数是undefined,返回undefined
例如:
var str = new Array(); console.log(str&&8);//返回值为8console.log(8&&null);//返回结果为null
特性:
1、当且仅当两个运算数的值都是true时,才返回true,否则返回false。
2、短路操作:当第一个操作数的值为false时,则不再对第二个操作数进行求值。
逻辑与,逻辑非都遵循从左向右判断,谁的第一个操作数逻辑判断为true就返回谁,只不过逻辑非必须两个都为true,而且谁是第一个false就返回谁。
逻辑或(||)
简单说就是或(or)的意思。
//给定 x=6 以及 y=3(x==5 || y==5) 为 false
规则:
- 第一个操作数是对象,返回第一个操作数
- 第一个操作数值为false,返回第二个操作数
- 两个操作数都是对象,返回第一个操作数
- 两个操作数都是NULL,返回NULL
- 两个操作数都是NaN,返回NaN
- 两个操作数都是undefined,返回undefined
特性:
1、当且仅当两个运算数的值都为false时,才会返回false,否则返回true。
2、如果第一个操作数值为true,则不会对第二个操作数进行求值。
位运算符
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
有符号32位整数
所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。补码形式是指一个数的负对应值(negative counterpart)(如 5和-5)为数值的所有比特位反转后,再加1。反转比特位即该数值进行’非‘位运算,也即该数值的反码。例如下面为整数314的二进制编码:
00000000000000000000000100111010
下面编码 ~314,即 314 的反码:
11111111111111111111111011000101
补码保证了当一个数是正数时,其最左的比特位是0,当一个数是负数时,其最左的比特位是1。因此,最左边的比特位被称为符号位(sign bit)。
0 是所有比特数字0组成的整数。
0 (base 10) = 00000000000000000000000000000000 (base 2)
-1 是所有比特数字1组成的整数。
-1 (base 10) = 11111111111111111111111111111111 (base 2)
-2147483648(十六进制形式:-0x80000000)是除了最左边为1外,其他比特位都为0的整数。
-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)
2147483647(十六进制形式:0x7fffffff)是除了最左边为0外,其他比特位都为1的整数。
2147483647 (base 10) = 01111111111111111111111111111111 (base 2)
数字-2147483648 和 2147483647 是32位有符号数字所能表示的最小和最大整数。
按位逻辑操作符
从概念上讲,按位逻辑操作符按遵守下面规则:
- 操作数被转换成32位整数,用比特序列(0和1组成)表示。超过32位的数字会被丢弃。例如, 以下具有32位以上的整数将转换为32位整数:
转换前: 11100110111110100000000000000110000000000001转换后: 10100000000000000110000000000001
- 第一个操作数的每个比特位与第二个操作数的相应比特位匹配:第一位对应第一位,第二位对应第二位,以此类推。
- 位运算符应用到每对比特位,结果是新的比特值。
& (按位与)
对每对比特位执行与(AND)操作。只有 a 和 b 都是 1 时,a AND b 才是 1。与操作的真值表如下:
9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
将任一数值 x 与 0 执行按位与操作,其结果都为 0。将任一数值 x 与 -1 执行按位与操作,其结果都为 x。
| (按位或)
对每一对比特位执行或(OR)操作。如果 a 或 b 为 1,则 a OR b 结果为 1。或操作的真值表:
9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)
将任一数值 x 与 0 进行按位或操作,其结果都是 x。将任一数值 x 与 -1 进行按位或操作,其结果都为 -1。
^ (按位异或)
对每一对比特位执行异或(XOR)操作。当 a 和 b 不相同时,a XOR b 的结果为 1。异或操作真值表:
9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)
将任一数值 x 与 0 进行异或操作,其结果为 x。将任一数值 x 与 -1 进行异或操作,其结果为 ~x。
~ (按位非)
对每一个比特位执行非(NOT)操作。NOT a 结果为 a 的反转(即反码)。非操作的真值表:
9 (base 10) = 00000000000000000000000000001001 (base 2)~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)
对任一数值 x 进行按位非操作的结果为 -(x + 1)。例如,~5 结果为 -6。
按位移动操作符
按位移动操作符有两个操作数:第一个是要被移动的数字,而第二个是要移动的长度。移动的方向根据操作符的不同而不同。
按位移动会先将操作数转换为大端字节序顺序(big-endian order)的32位整数,并返回与左操作数相同类型的结果。右操作数应小于 32位,否则只有最低 5 个字节会被使用。
注:Big-Endian:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,
又称为"高位编址"。
Big-Endian是最直观的字节序:
①把内存地址从左到右按照由低到高的顺序写出;
②把值按照通常的高位到低位的顺序写出;
③两者对照,一个字节一个字节的填充进去。
<< (左移)
该操作符会将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充。
例如:9 << 2 得到 36:
>> (有符号右移)
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。由于新的最左侧的位总是和以前相同,符号位没有被改变。所以被称作“符号传播”。
例如, 9 >> 2 得到 2:
9 (base 10): 00000000000000000000000000001001 (base 2)9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
>>> (无符号右移)
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(译注:即便右移 0 个比特,结果也是非负的。)
对于非负数,有符号右移和无符号右移总是返回相同的结果。例如 9 >>> 2 和 9 >> 2 一样返回 2:
9 (base 10): 00000000000000000000000000001001 (base 2)9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
但是对于负数却不尽相同。 -9 >>> 2 产生 1073741821 这和 -9 >> 2 不同:
-9 (base 10): 11111111111111111111111111110111 (base 2)-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)
说到这里,本篇的逻辑运算符和位运算符我们就讲到这里了,下期我们再讲JavaScript数组。
想了解更多的前端技术,关注我,持续为您输出干货,谢谢!