不用中间变量交换两个数值变量的值

  1. 加减法

    1
    2
    3
    4
    5
    6
    7
    8
    var a = 1,
    b = 2;
    a = a + b;
    b = a - b;
    a = a - b;
    console.log(a, b); // 2, 1

    该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    var a = 1.123456789,
    b = 2.987654321;
    a = a + b;
    b = a - b;
    a = a - b;
    console.log(a, b); // 2.987654321, 1.1234567889999996
  2. 乘除法

    1
    2
    3
    4
    5
    6
    7
    8
    var a = 3,
    b = 4;
    a = a * b;
    b = a / b;
    a = a / b;
    console.log(a, b); // 4, 3

    乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b 必不为 0。

  3. 异或法

    1
    2
    3
    4
    5
    6
    7
    8
    var a = 5,
    b = 6;
    a ^= b; // a = a^b;
    b ^= a; // b = b^a = b^(a^b) = b^a^b = b^b^a = 0^a = a;
    a ^= b; // a = a^b = (a^b)^a = a^b^a = a^a^b = 0^b = b;
    console.log(a, b); // 6, 5

    异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。