软件研发

如何在JavaScript中交换值?

2020-09-02 17:16:34 | 来源:中培企业IT培训网

很多开发人员,对于如何在JavaScript中交换值不清楚。在职业生涯的某个时刻,开发人员需要有交换价值。大多数时候,我们使用一种简单的旧解决方案使用临时变量gh。在绝望的时刻,我们在网上搜寻解决方案,找到解决方案,然后将其复制,而无需怀疑这小段代码是如何工作的。幸运的是,现在该是学习如何轻松高效地交换价值,来消除开发人员的痛苦了。

  1.使用临时变量

让我们让最明显的一个成为可能。

function swapWithTemp(num1,num2){

console.log(num1,num2)

var temp = num1;

num1 = num2;

num2 = temp;

console.log(num1,num2)

}

swapWithTemp(2.34,3.45)

  2.使用算术运算符+和-是的。我们可以使用一些数学魔术来交换您的价值

function swapWithPlusMinus(num1,num2){

console.log(num1,num2)

num1 = num1+num2;

num2 = num1-num2;

num1 = num1-num2;

console.log(num1,num2)

}

swapWithPlusMinus(2.34,3.45)

是的,让我们看看它是如何工作的。我们在第4行获得两个数字的总和。现在,如果从总和中减去一个数字,那么另一个数字就正确了。这就是我们在第5行上所做的事情。从存储在num1变量中的总和中减去num2会得到我们存储在num2中的原始num1值。同样,在第6行的num1中获得赋值num2的值。

当心:互联网上还存在一个带有+和-的单行交换。

外观如下:

function swapWithPlusMinusShort(num1,num2){

console.log(num1,num2)

num2 = num1+(num1=num2)-num2;

console.log(num1,num2)

}

swapWithPlusMinusShort(2,3)

上面的程序给出了预期的结果。()中的表达式

将num2存储在num1中,然后我们减去num1 — num2,除了减去num2 — num2 = 0外什么也没有。因此,我们得到了结果。但是,当我们使用浮点数时,会看到一些意外的结果。

尝试在控制台中使用如下所示的值。

function swapWithPlusMinusShort(num1,num2){

console.log(num1,num2)

num2 = num1+(num1=num2)-num2;

console.log(num1,num2)

}

swapWithPlusMinusShort(2,3.1)

  3.仅使用+或-运算符

仅通过使用+运算符就可以达到与同时使用+和-时相同的结果。

让我们在下面看到它:

function swapWithPlus(num1,num2){

console.log(num1,num2)

num2 = num1 + (num1=num2, 0)

console.log(num1,num2)

}

//Try with - operator

swapWithPlus(2.3,3.4)

上面的程序有效,但牺牲了可读性。在()中的第4行,我们将num1分配给num2,而旁边的0是返回值。简而言之,我们的第4行如下所示:

num2 = num1 + 0 => num2 = num1.

因此,我们得到了结果。

注意:某些JavaScript引擎可以对上述忽略+ 0的代码执行自己的优化。

  4.使用算术运算符*和/让我们使用*&/运算符做更多的魔术

其原理与先前的方法相同,但有一些微小的怪癖。

function swapWithMulDiv(num1,num2){

console.log(num1,num2)

num1 = num1*num2;

num2 = num1/num2;

num1 = num1/num2;

console.log(num1,num2)

}

swapWithMulDiv(2.34,3.45)

与上一个相同。我们得到两个数字的乘积,并将它们存储在一个数字中。这就是我们在第5行上执行的操作。然后,将其中一个与产品相除,得到第一个数字,然后重复此过程以获得第二个数字。你做到了,你是一个“ 数学家 ”。

function swapWithMulDiv(num1,num2){

console.log(num1,num2)

num1 = num1*num2;

num2 = num1/num2;

num1 = num1/num2;

console.log(num1,num2)

}

//Try switching out the numbers and see what happens

swapWithMulDiv(2.34,0)

我们的价值观没有被交换,而是得到了一个奇怪的NaN。到底是什么。如果您还记得数学课,我们总是被告知不要除以0,因为它是不确定的。原因在于限制的工作方式以及其他一些我们不会理解的原因。现在,让我们看看这种方法的其他问题

考虑以下示例:

function swapWithMulDiv(num1,num2){

console.log(num1,num2)

num1 = num1*num2;

num2 = num1/num2;

num1 = num1/num2;

console.log(num1,num2)

}

//Try switching the numbers and see what happens

swapWithMulDiv(2.34,Infinity)

是的,又是NaN。因为您无法使用Infinity分割任何内容,所以它是未定义的。

想要再看一遍。我是这么想的。

function swapWithMulDiv(num1,num2){

console.log(num1,num2)

num1 = num1*num2;

num2 = num1/num2;

num1 = num1/num2;

console.log(num1,num2)

}

//Try switching out the numbers and see what happens

swapWithMulDiv(2.34,-Infinity)

Infinity将产生与前面的示例相同的结果,原因也相同。

事实证明,即使是一位伟大的“ 数学家 ”也无法尽其所能。

这是用*和/交换的较短版本,但存在相同的问题:

function swapWithMulDivShort(num1,num2){

console.log(num1,num2)

num2 = num1*(num1=num2)/num2;

console.log(num1,num2)

}

swapWithMulDivShort(2.3,3.4)

当我们使用+和-进行交换时,上面的代码类似于较短的代码。我们将num2分配给num1,然后我们的第4行看起来

像这样:

num2 = num1 * num2 / num2=> num2 = num1

我们的价值观被交换了。

  5.仅使用*或/运算符

function swapWithMul(num1,num2){

console.log(num1,num2)

num2 = num1 * (num1=num2, 1)

console.log(num1,num2)

}

//Try with / and ** operator

swapWithMul(2.3,3.4)

上面的程序有效,但牺牲了可读性。在()中的第4行中,我们将num1分配给num2,旁边的1是返回值。简而言之,我们的第4行如下所示:

num2 = num1 * 1 => num2 = num1

因此,我们得到了结果。

  6.使用按位异或。

XOR操作二进制位。当我们有两个不同的输入时,它的结果为1,否则为0。

因此,让我们了解其工作原理。

function swapWithXOR(num1,num2){

console.log(num1,num2)

num1 = num1^num2;

num2 = num1^num2;

num1 = num1^num2;

console.log(num1,num2)

}

// Try negative values

swapWithXOR(10,1)

4位二进制数10-> 1010

1-> 0001的4位二进制

On line 5: num1 = num1 ^ num2 => 1010 ^ 0001 => 1011 => 7 On line 6: num2 = num1 ^ num2 => 1011 ^ 0001 => 1010 => 10On line 7: num1 = num1 ^ num2 => 1011 ^ 1010 => 0001 => 1

瞧!我们有交换的值。

让我们来看另一个例子。

function swapWithXOR(num1,num2){

console.log(num1,num2)

num1 = num1^num2;

num2 = num1^num2;

num1 = num1^num2;

console.log(num1,num2)

}

swapWithXOR

交换的值在哪里?我们只是得到数字的整数部分。这就是那里的问题。XOR假定输入是整数,因此将相应地执行计算。但是浮点数不是整数,而是由IEEE 754标准表示,它将数字分为三部分:符号位,一组代表指数的位和另一组代表1和2之间的数字,尾数。因此,我们得到不正确的值。

另一个例子:

function swapWithXOR(num1,num2){

console.log(num1,num2)

num1 = num1^num2;

num2 = num1^num2;

num1 = num1^num2;

console.log(num1,num2)

}

//Try experimenting with infinities and integer values.

swapWithXOR(-Infinity,Infinity)

再次。我们没有看到预期的结果。这是因为Infinity和–Infinity都是浮点数。正如我们上面所讨论的,对于XOR,浮点数是一个问题。

  7.使用按位XNOR

它也操纵二进制位,这与XOR相反。

当我们有两个不同的输入时,XNOR 产生0,否则产生1。JavaScript没有执行XNOR的单个运算符,因此我们使用NOT运算符来取反XOR的结果。

因此,让我们了解其工作原理!

function swapWithXNOR(num1,num2){

console.log(num1,num2)

num1 = ~(num1^num2);

num2 = ~(num1^num2);

num1 = ~(num1^num2);

console.log(num1,num2)

}

//Try negative values

swapWithXNOR(10,1)

4位二进制数10-> 1010

1-> 0001的4位二进制

在第4行:

num1 = ~(num1 ^ num2) => ~(1010 ^ 0001) =>~(1011) => ~11 => -12

由于我们有一个负数,我们需要将其转换回二进制并执行2的补码以获取十进制值,例如:

-12 => 1100 => 0011 + 1 => 0100

在第5行:

num2 = ~(num1 ^ num2) => ~(0100 ^ 0001) => ~(0101) => ~5 => -6

-6 => 0110 => 1001 + 1 => 1010 => 10

在第6行:

num1 = ~(num1 ^ num2) => ~(0100^ 1010) => ~(1110) => ~14 => -15

-15 => 1111 => 0000 + 1 => 0001 => 1

花费了一些时间,但我们交换了价值。但不幸的是,它遇到了与XOR相同的问题。它不能处理浮点数和无穷大。

尝试尝试如下所示的一些值。

function swapWithXNOR(num1,num2){

console.log(num1,num2)

num1 = ~(num1^num2);

num2 = ~(num1^num2);

num1 = ~(num1^num2);

console.log(num1,num2)

}

swapWithXNOR(2.3,4.5)

  8.在数组中使用分配

这是一个单行的把戏。真!您只需要一行即可执行交换,更重要的是,无需数学运算。您只需要数组的基本知识。它可能看起来很奇怪,但请紧紧抓住。

所以,让我们看看它的实际效果!

function swapWithArray(num1,num2){

console.log(num1,num2)

num2 = [num1, num1 = num2][0];

console.log(num1,num2)

}

swapWithArray(2.3,Infinity)

在数组的索引0中,我们存储num1,在索引1中,我们既将num2分配给num1,又存储了num2。另外,我们只是访问[0],将数组中的num1值存储在num2中。而且我们可以在这里交换我们想要的任何东西,整数,浮点数以及字符串。实际上这很整洁,但是我们在这里失去了代码的清晰度。让我们探索其他东西。

  9.使用解构表达式

这是ES6的功能。这是所有人中最简单的。在一行中,我们可以交换以下值:

let num1 = 23.45;

let num2 = 45.67;

console.log(num1,num2);

[num1,num2] = [num2,num1];

console.log(num1,num2);

  10.使用立即调用的函数表达式

这是一个奇怪的。简而言之,IIFE是在定义后立即执行的功能。

我们可以使用它来交换值:

function swapWithIIFE(num1,num2){

console.log(num1,num2)

num1 = (function (num2){ return num2; })(num2, num2=num1)

console.log(num1,num2)

}

swapWithIIFE(2.3,3.4)

在上面的示例中,我们立即在第4行调用一个函数。最后的括号是该函数的参数。第二个参数将num1分配给num2,第一个参数num1刚刚返回。因此,将交换值。请记住,这种交换方法效率不高。

好了,关于如何在JavaScript中交换值相信大家已经清楚了吧,想了解更多关于JavaScript的信息,请继续关注中培伟业。