JavaScript中的逻辑运算符与位运算符

逻辑运算符

1.&& 逻辑与

a && b

运算逻辑:

a && b, 若 a 为 false 则返回 a, 若 a 为 true 则返回 b

 console.log(3 && 1) // 1
 console.log(0 && 1) // 0 
 // ps: 0为false

总结:假前真后

2.|| 逻辑或

a || b

运算逻辑:

a || b, 若 a 为 false 则返回 b, 若 a 为 true 则返回 a

console.log(3 || 1) // 3
console.log(0 || 1) // 1
console.log('' || true) // true
// ps: ''空字符串在js中也会被判定为false
console.log(!!'') // false

总结:真前假后

3.! 逻辑非

!a

运算逻辑:

若 a 为 true, 则返回 false, 反之亦然

console.log(!1) // false

若要显式的返回变量的布尔值则可以使用 !! 双重非运算符 来运算

console.log(!!1) // true
console.log(!!0) // false

需要注意的是在JS中会被转换为 false 的表达式有:

  • null
  • undefined
  • NaN
  • 0
  • 空字符串("" or '' or ``)

总结: 取反

位运算符

其实位运算符是所有语言通用的运算符,偷懒起见还是写在了JS分类下哈哈哈

位运算符都需要将运算符前后的数转为二进制再运算, 所谓的位是二进制数的位数

1.| 按位或运算符

a | b

运算规则:

0|0=0;0|1=1;1|0=1;1|1=1;即: a 和 b 的对应二进制位只要有一个为1,其值为1。

console.log(3 | 4) // 7
// 3转为二进制0011, 4转为二进制0100, 所以结果为0111, 输出7
console.log(31 | 2) // 31
// 31 -> 00011111 2 -> 00000010, 结果为00011111, 输出31

实际应用:

可用于小数取整

//后面为0时取小于该小数的最大整数
console.log(3.1 | 0) // 3
// 所有的位运算只会对小数起作用所以 3.1 | 0 会自动舍去小数部分达到取整效果
// 相当于 Math.floor(3.1);

2.& 按位与运算符

a & b

运算规则:

0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:a 与 b 的对应二进制位同时为“1”,结果才为“1”,否则为0.

console.log(3 & 4) // 0
console.log(31 & 2) // 2

3.~ 取反运算符

~a

运算规则:

将a按二进制位取反, 即将0变1, 1变0, 然后将二进制数变为浮点数

console.log(~25) // -26
// 00000000000000000000000000011001 -> 11111111111111111111111111100110 -26
// 就像是将正数变负, 再取其反码

从表现上而言 ~ 是对数字求负, 然后减 1, 因此 25 变 -26.

4.^异或运算符

a ^ b

运算规则:

0^0=0; 0^1=1; 1^0=1; 1^1=0; a 和 b ,按二进制位进行“异或”运算。

^ 运算符满足如下运算规则

  • 交换律:AB=BA
  • 结合律:ABC=A(BC)=(AB)C
  • 自反律:ABB=A^0=A
  • X^X=0 ,X^0=X
console.log(23^3) // 20
// 23 -> 00010111 3 -> 00000011 异或后为 00010100 -> 20

5. << 左移运算符

a << b

运算规则:

将a的各二进制位全部左移b位(左边的b个二进制位丢弃,右边补0)。

console.log(3 << 2) // 12
// 3 -> 0011 运算结果为 1100 -> 12

就结果而言, 左移运算符 << 便是 a 乘上 2 的 b 次方

6. >> 右移运算符

运算规则:

将a的各二进制位全部右移b位(右边的b个二进制位丢弃,若是正数, 左边补0, 若是负数则补1, 及补其符号位的数)。

console.log(12 >> 2) // 3
console.log(12 >> 4) // 0
// 3 -> 0011 运算结果为 1100 -> 12

就结果而言, 右移运算符 << 便是 a 除以 2 的 b 次方, 若 2 的 b 次比 a 要大, 结果最小为 0

此时会有小伙伴问了, 普通整型是只有32位的, 如果 b 的值大于32或者小于0会怎么运算啊

那我们不妨来试试

console.log(4 << 34) // 16

4 向左移位34位照理来说已经超出了原位数, 但是输出结果为16相当于左移两位 34 - 32 = 2,
说到这应该明白了吧, 不过不清楚是走过了循环还是运行js的引擎自动将b%32

console.log(4 << -30) // 16

其实看到这里也大概知道左移负数位的规则了吧, -30 + 32 = 2, 同样也是4 << 2 = 16

不同长度的数据进行位运算

如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

我们知道在C语言(此处拿C举例, 毕竟JS没有long int之分..)中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行“与”运算,
右端对齐后,左边不足的位依下面三种情况补足,

  • 如果整型数据为正数,左边补16个0。
  • 如果整型数据为负数,左边补16个1。
  • 如果整形数据为无符号数,左边也补16个0。

你可能感兴趣的:(JavaScript中的逻辑运算符与位运算符)