数组元素互换本质是两索引值对调,需校验索引合法性、用解构赋值高效交换、封装为可复用函数,并支持按值查找索引等扩展场景。
数组元素互换本质是两个索引位置的值对调,关键不在“怎么写”,而在“怎么写得稳、快、可复用”。直接操作原数组、避免副作用、提前拦截非法索引,这三点决定了逻辑是否真正高效。
校验索引合法性再交换
越界访问不会报错,但会静默写入 undefined,导致数据污染。必须在交换前确认索引有效:
- 检查 i 和 j 是否为合法数字(非
null、NaN、字符串等) - 验证
i >= 0 && i < arr.length且j >= 0 && j < arr.length - 允许
i === j(无需操作),但拒绝负数或超长索引
优先使用解构赋值(ES6+)
一行代码完成交换,语义清晰,无临时变量干扰作用域:
- 写法:
[arr[i], arr[j]] = [arr[j], arr[i]] - 它不是“语法糖”,而是 JS 引擎优化过的原子操作,性能不输临时变量
- 注意:若数组含对象或数组等引用类型,交换的是引用,不是深拷贝
封装成可复用函数
把校验 + 交换打包成函数,避免重复逻辑,也方便单元测试:
- 函数签名建议:
swap(arr, i, j),返回arr(支持链式调用) - 内部先做边界检查,不满足则直接
return arr,不抛错也不静默失败 - 可扩展支持「安全模式」:传入
{ strict: true }时,非法索引才抛RangeError
特殊场景:按值找索引再交换
当只知道要交换的值(比如 'apple' 和 'banana'),而非索引时:
- 用
arr.indexOf(value)获取索引,注意返回-1表示未找到 - 务必二次校验
idx1 !== -1 && idx2 !== -1,再执行解构交换 - 如需交换所有匹配项(不止第一个),改用
arr.map()或for循环遍历

















