JavaScript按位取反运算符(~),是对一个表达式执行按位非运算。

例如:

1
2
3
~1 = -2
~2 = -3
~99 = -100

运算示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var temp = ~5;
/*
5 二进制 101,补满 32位
00000000000000000000000000000101
按位取反得到结果的补码(计算机中都是以补码的形式存储)
11111111111111111111111111111010
由于32位开头第一个是1,所以这是一个负数,将二进制转换成负数,需要先反码
00000000000000000000000000000101
之后,再+1
00000000000000000000000000000110
转换成十进制为6,加上符号变成负数 -6

取反的简便方法:
如对a按位取反,则得到的结果为-(a+1);
此条运算方式对正数、负数、0都适用;
*/
alert(temp);
// 弹出【-6】

使用小技巧

  • 与indexOf配合使用方便进行判断

    由于JavaScript数组里面没有contain的方法,所以每次查找一个元素是否存在时都使用indexOf去操作,而indexOf并没有给一个boolean值,而是给了一个下标,多了一步,这个时候按位取反运算符便派上用途。

例如:

1
2
3
4
5
6
7
8
// 而只有一种情况是会被if默认判断为false的,即0,
// 在数组找不到的情况下返回-1
// ~-1 ==> 0
if(~arr.indexOf(val)) {
// if val in arr
} else {
// else
}

  • 替代Math.floor,取整

~~取反运算符的运行速度比Math.floor快了不少

例如:

1
2
~~5.1231232  // 5
~~3.14125926 // 3