【面试题】不建立第三个变量情况下交换变量数据

这是我看到的 一道有意思的题目,一开始是懵的:“什么玩意?”,后来思考思考,发现自己可能是 Java 这种强变量类型做多了,思维僵硬了,都忘记了 Javascript 是一种灵活的弱变量类型的语言,也就是变量类型定义以后,随时可以再次修改。。。下面总结几种方法。

算术计算

这种方法只能针对两个变量都为 Number 类型的,就是通过数学方法实现交换变量。

// 加法算术
var a = 1, b = 10;
a = a + b; // a = 11
b = a - b; // b = 1
a = a - b; // a = 10

// 减法算术
var a = 1, b = 10;
a = a - b; // a = -9
b = a + b; // b = 1
a = b - a; // a = 10

对象属性

这个就是我思维定势的地方,因为 Javascript 中变量是弱类型的,所以我们完全可以把原来的变量改成能保存所有要交换变量的对象!

// 数组方式
var a = 1, b = 10;
a = [a, b]; // a = [1, 10]
b = a[0]; // b = 1
a = a[1]; // a = 10

// 对象属性方式
var a = 1, b = 10;
a = {"a": a, "b": b}; // a = {"a": 1, "b": 10}
b = a.a; // b = 1
a = a.b; // a = 10

隐式转换

这类方法算是比较另类,它主要是利用了 Javascript 中对变量的隐式转换,比如 alert 的参数为字符串类型,但是如果你这样写 alert(3+4),也是能弹出 7 这个结果的,就是因为 Javascript 对 3+4 这个表达式进行了隐式计算。

var a = 1, b = 10;
a = [b, b = a][0];
// 数组不接受函数表达式, 所以会对赋值表达式进行隐式计算
console.log(a); // 10
console.log(b); // 1

解构赋值

这个方法属于 ES6 的方法了,不是所有浏览器都能支持的。

var a = 1, b = 10;

[a, b] = [b, a];

// a = 10
// b = 1