[TOC] #### 1. 前言 --- 在面试中被问到 “如何交换两个变量的值” 这类问题,通常并不是单纯的考察你能否写出交换代码 而是想考察以下几个方面: + 算法思维与灵活性:能否从不同角度思考问题,使用多种方法实现交换 + 对语言特性的理解:比如 ES6 的解构赋值 + 编码风格和可读性:能否写出简洁、易读,符合现代语言规范的代码 使用解构赋值是推荐用法,因为它代码简洁、可读性高,并且适用于任何数据类型,不像运算法交换具有局限性 #### 2. 交换变量 --- ##### 临时变量法 ```javascript let a = 1 let b = 2 let temp = a a = b b = temp ``` ##### 解构赋值法 ```javascript // ; 不能省略,否则解构时左侧会被当作字面量,进而导致报错 let a = 1; let b = 2; [a, b] = [b, a]; ``` #### 3. 其他方法 --- 你可能还看到过其他方法交换变量,但是存在缺陷的,比如:异或运算法、算术运算法 交换两个整数,是没有问题的,但如果交换的是字符串,交换结果就是错误的了,因为运算法交换过程中会有类型转换 ```javascript let a = 10; let b = 'hello'; ``` ##### 算术运算法 ```javascript let a = 1; let b = 2; a = a + b; b = a - b; a = a - b; ``` ##### 异或运算法 ```javascript let a = 1 let b = 2 a = a ^ b; b = a ^ b; a = a ^ b; ```