按位非运算符(~)在javascript中对整数执行逐位取反,先转为32位有符号补码,再翻转所有位,结果等价于-(x+1);常用于索引存在性判断,如~indexof()返回0表示未找到,非0表示存在。

按位非运算符(~)在 JavaScript 中对整数执行的是**逐位取反**,不是数学意义上的“负号取反”,也不是简单的加减 1。它先把操作数转为 32 位有符号整数(补码表示),再对每一位(0 变 1,1 变 0)进行翻转,结果仍按补码解释。
理解 ~ 的实际效果:~x 等价于 -(x + 1)
由于补码的特性,对任意整数 x,有恒等式:
~x === -(x + 1)
这是最实用的记忆方式和计算依据。
- ~5 → -(5 + 1) = -6
- ~-3 → -(-3 + 1) = -(-2) = 2
- ~0 → -(0 + 1) = -1
- ~(-1) → -(-1 + 1) = -0 = 0
为什么不是直接“变符号”?
按位非是底层位操作,不关心正负,只翻转所有 32 位:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 5 的 32 位二进制(补码)是:
00000000 00000000 00000000 00000101 - 取反后:
11111111 11111111 11111111 11111010 - 该值是 -6 的补码表示(因为 -6 的补码正是这个)
常见用途:快速判断数组/字符串索引是否存在
利用 ~indexOf() 转换为布尔值:
-
str.indexOf('a') >= 0→ 写成~str.indexOf('a')作为真值(非零即真) -
if (~arr.indexOf(x)) { ... }表示 “x 在 arr 中存在” - 原理:当
indexOf返回 -1(未找到),~(-1) = 0 → 假;其余情况返回 ≥0 的数,取反后均为非零 → 真
注意边界与类型转换
~ 只对数字有效,会先将操作数转为 32 位整数:
-
~3.14→ 先转为 3 → ~3 = -4 -
~null→ null → 0 → ~0 = -1 -
~undefined→ undefined → NaN → ~NaN → -1(因 NaN 转整数为 0) - 超大整数会被截断(如
~(2**32)等价于 ~(0),得 -1)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










