JavaScript中按位异或交换整数依赖归零律、恒等律及结合交换律,三步完成无临时变量交换,但仅适用于整数,需防同一变量自交换,现代开发推荐解构赋值。

JavaScript 中用按位异或(^)交换两个整数,本质是靠三条代数性质:归零律(x ^ x === 0)、恒等律(x ^ 0 === x)、结合律与交换律。三步操作即可完成互换,全程不依赖临时变量。
标准三步写法及推导过程
设初始 a = x,b = y:
-
a = a ^ b→ 此时a变为x ^ y -
b = a ^ b→ 即(x ^ y) ^ y === x ^ (y ^ y) === x ^ 0 === x,b得到原a的值 -
a = a ^ b→ 即(x ^ y) ^ x === y ^ (x ^ x) === y ^ 0 === y,a得到原b的值
必须检查地址是否相同
如果 a 和 b 实际指向同一内存位置(例如 swap(arr[i], arr[i]) 或函数内传入同一引用),第一步 a = a ^ a 就会让值归零,后续全失效。
- 在函数中应显式判断:
if (a === b) return(适用于原始值比较;若处理对象/数组元素,需确保非同一索引) - 宏或解构式写法(如
[a, b] = [b, a])天然规避该问题,但异或写法本身无自动防护
适用范围与明显限制
异或交换不是“通用技巧”,而是有明确边界的操作:
立即学习“Java免费学习笔记(深入)”;
- 仅支持整数:JavaScript 中虽可对任意数字执行
^,但浮点数会先被强制转为 32 位有符号整数,精度丢失(如3.14 ^ 2.8实际算的是3 ^ 2) - 不适用于
null、undefined、字符串、对象、布尔值——它们会先被 ToNumber 转换,结果不可控 - 无法用于指针或引用类型;数组、对象交换请直接用解构赋值
现代 JS 中更推荐的替代方案
异或交换在教学和面试中仍有价值,但在实际工程中已非首选:
-
解构赋值:
[a, b] = [b, a]—— 简洁、安全、类型无关、可读性强,ES2015 起原生支持 - 临时变量 —— 编译器优化充分,性能无差异,调试友好,语义清晰
- 加减/乘除法交换存在溢出或除零风险,且不适用于小数,实用性更低
除非在极特殊嵌入式场景(如 WebAssembly 模块或栈空间极度受限),否则无需刻意使用异或交换。


















