你可能需要知道的运算符的巧用系列

216 阅读2分钟

性能更佳,骚操作系列😁

符号 描述 规则
& 按位与 两位都为1才为1,不同为0
| 按位或 两位都为0才为0,不同为1
^ 异或 相同为0,不同为1
~ 取反 0变1,1变0
<< 左移 二进制位向左移动,高位去掉,低位补0
>> 右移 二进制位向右移动,低位去掉,高位补0

~~ 取整操作

~~null  // 0
~~undefined  // 0
~~0 // 0
~~{}  // 0
~~[]  // 0
~~(1/0)  // 0
~~''  // 0
~~'abc' // 0
~~false  // 0
~~true   // 1
~~1.2345   // 1
~~4.6   // 4
~~'4.6' // 4
~~' 4.6 ' // 4
~~'-4.6' // 4
~~(-2.6)  // -2
~~(-2.4)  // -2

使用指南:

  • 对于非数字或非数字字符串,~~的结果为0,布尔值的true是1
  • 对于大于0的数字或数字字符串(允许左右带有空字符串),~~相当于是Math.floor(取下整取)
  • 对于小于0的数字或数字字符串(允许左右带有空字符串),~~相当于Math.ceil(取上取整)或者是-(Math.floor(Math.abs(val)))

+ 转数字类型

+new Date() // 1594268105568
+'1'  // 1

使用指南:转数字类型,例如获取时间戳,字符串转数字类型

1<<n 取2的n次方

1<<1  // 2
1<<2  // 4
1<<0 // 1
1<<-1  // -2147483648

使用指南:表示取2的n次方,n为>=0的整数,如果为小数,则取整数部分

n & 1 判断奇偶数

3 & 1 // 1
2 & 1 // 0

使用指南:判断奇偶数。偶数二进制编码最低位为0,奇数的二进制编码最低位是1.奇数会得到1, 偶数会得到0

^ 交换两个数

a = 3, b = 5
a = a ^ b = 011 ^ 101 = 110
b = a ^ b = 110 ^ 101 = 011 = 3
a = a ^ b = 110 ^ 011 = 101 = 5
a = 5, b = 3

使用指南:使用异或运算符^交换两个数

>> 判断正负数

一个长度为1字节,8位的数字(数值范围:-128 ~ 256,计算-2^72^8
对于正整数来说,右移7位,可以得到0.
对于负整数来说,左移7位,可以得到-1 从而判断正负数

3 >> 7 = 0000 0011 >> 7 = 0000 0000 = 0
-3 >> 7 = 1000 0011(原) >> 7 = 1111 1101(补) >> 7 = 1111 1111(补) = 1000 0001(原) = -1