JavaScript中交换两个变量值的常见方法及性能比较
Contents
在 JavaScript 中交换两个变量值,一般有以下几种方法:
法一
利用一个临时变量
function exchange0 (a, b) {
let tmp = a;
a = b;
b = tmp;
}
优点:最简单易懂的方式,适用一切情况,性能高。
缺点:需要使用临时变量。
法二
通过和差运算
function exchange1 (a, b) {
a += b;
b = a - b;
a -= b;
}
优点:不需使用临时变量。
缺点:仅适用于数字类型的交换。
法三
通过位运算
function exchange2 (a, b) {
a ^= b;
b ^= a;
a ^= b;
}
优点:利用位运算,速度快。
缺点:仅适用于数字类型的交换。
法四
借助对象
function exchange3 (a, b) {
a = {a:b, b:a};
b = a.b;
a = a.a;
}
优点:适用于所有类型。
法五
借助数组
function exchange4 (a, b) {
a = [a, b];
b = a[0];
a = a[1];
}
// 下面是简写形式
function exchange5 (a, b) {
a = [b, b = a][0];
}
优点:适用于所有类型。
缺点:性能似乎有些欠缺。
法六
利用ES6的解构赋值
function exchange6 (a, b) {
[a, b] = [b, a];
}
优点:适用于所有类型。
性能对比
测试环境:
操作系统:macOS 10.13.6
内存大小:16GB
NODE版本:v9.11.2
测试用例1:
let a = 1;
let b = 2;
方法 | 执行次数 | 耗时(ms) |
---|---|---|
exchange0 | 1e9 | 840~888 |
exchange1 | 1e9 | 836~844 |
exchange2 | 1e9 | 836~846 |
exchange3 | 1e9 | 840~848 |
exchange4 | 1e9 | 843~847 |
exchange5 | 1e9 | 835~849 |
exchange6 | 1e9 | 7235~7936 |
测试用例2:
let c = 'c';
let d = 'd';
方法 | 执行次数 | 耗时(ms) |
---|---|---|
exchange0 | 1e9 | 822~865 |
exchange3 | 1e9 | 807~839 |
exchange4 | 1e9 | 810~869 |
exchange5 | 1e9 | 808~841 |
exchange6 | 1e9 | 7120~7508 |
Author ChrisShen93
LastMod 2018-07-28