JavaScript中可用异或运算符^实现整数变量原地交换,原理基于a^a=0、a^0=a、a^b^b=a;但仅限整数,不支持浮点数、NaN、Infinity及非数字类型,且可读性差,推荐使用解构赋值[a,b]=[b,a]。

JavaScript 中可以用异步运算符 ^ 实现两个数值变量的原地交换,无需临时变量,但仅适用于整数且有严格限制。
原理:利用异或的数学性质
异或(XOR)满足三个关键性质:
- a ^ a = 0(相同数异或得 0)
- a ^ 0 = a(与 0 异或不变)
- a ^ b ^ b = a(可消去重复项)
因此,对两个变量 a 和 b 执行三步操作即可交换:
a = a ^ b-
b = a ^ b(此时 a 已更新,等价于(a^b) ^ b = a) -
a = a ^ b(此时 b 已是原 a,等价于(a^b) ^ a = b)
正确写法示例(仅限整数)
必须确保变量为**整数**,且不能是 NaN、Infinity 或浮点数(因 JS 内部用 IEEE 754 表示,浮点数异或会先转为 32 位有符号整数,导致精度丢失):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a, b); // 输出:9 5
常见误区和限制
-
不支持浮点数:如
a = 3.14,执行a ^ b会先取整为 3,造成数据错误 -
不支持非数字类型:字符串、对象、null 等会强制转换为数字再异或,结果不可控(如
"2" ^ "3"得 1,但null ^ undefined得 0) -
不能自交换:若
a和b引用同一变量(如通过对象属性),会导致值变 0 -
可读性差、无实际优势:现代 JS 引擎优化充分,解构赋值
[a, b] = [b, a]更安全、清晰、通用
推荐替代方案
日常开发中应优先使用语义明确、兼容性好的方式:
- 数值/任意类型交换:
[a, b] = [b, a] - 函数内交换参数值:仍用解构,或直接返回新数组
- 需要位运算场景(如加密、算法题)时,再谨慎使用异或交换

















