早期之前,我们在JS中交换值的时候,主要是使用临时变量。在ES6之后,我们可以使用扩展运算符来交换变量。除了这两种方法,你还能想到什么?本文主要介绍10种交换变量的方法,快来看看吧!1.使用临时变量函数swapWithTemp(num1,num2){console.log(num1,num2)lettemp=num1num1=num2num2=tempconsole.log(num1,num2)}swapWithTemp(66.66,8.88)2.使用算术运算符+和-函数swapWithPlusMinus(num1,num2){console.log(num1,num2)num1num1=num1+num2num2=num1-num2num1num1=num1-num2console.log(num1,num2)}swapWithPlusMinus(66,8)主要过程如下如下,先求两个数的和,然后用第一个数代替第二个数的值就是总和减去第二个,即代码中的num2=num1-num2,同理,第一个数需要替换为第二个数字的值,即总和减去第一个数字的值。现在第一个数已经赋值给第二个数了,直接减去第二个数的值就可以了。那就是num1=num1-num2但是我试了小数,好像有点问题,有点尴尬,不过还是要掌握这种思路。也可以简写成:functionswapWithPlusMinusShort(num1,num2){console.log(num1,num2)num2=num1+(num1=num2)-num2console.log(num1,num2)}这里的技巧是(num1=num2),在这一步中,我们让num1等于num2,并返回num2的值,此时num1的值已经被交换了。然后用num1加上(num1=num2)返回的值,即num1+num2求和,然后思路和上面分析的一样。然而,在使用浮点数时,你也会得到一些意想不到的结果。您可以在控制台中运行以下代码:functionswapWithPlusMinusShort(num1,num2){console.log(num1,num2)num2=num1+(num1=num2)-num2console.log(num1,num2)}swapWithPlusMinusShort(2,3.1)3.仅使用+或-运算符只需使用+运算符即可获得与同时使用+和-相同的结果。functionsswapWithPlus(num1,num2){console.log(num1,num2)num2=num1+(num1=num2,0)console.log(num1,num2)}swapWithPlus(2.3,3.4)上面的程序可以工作,但是有代价的可读性。在()中,我们将num1赋值给num2,0旁边就是返回值。简而言之,第4行如下所示:num2=num1+0=>num2=num14。算术运算符*和/*和/的使用原理与前面的方法相同,有一些细微的差别。functionswapWithMulDiv(num1,num2){console.log(num1,num2)num1num1=num1*num2num2=num1/num2num1num1=num1/num2console.log(num1,num2)}swapWithMulDiv(2.3,3.4)同上一个。我们得到两个数字的乘积,并将它们存储在其中一个变量中,对应于num1=num1*num2。然后,将相应的变量除以总和,得到交换后变量的值。但这有什么问题呢?也就是说,如果存在与0的交换值,我们会遇到意想不到的问题:swapWithMulDiv(2.34,0)//2.340//NaNNaN我们的值没有被交换,但是我们得到了一个奇怪的NaN。所以发生了什么事?如果你还记得你的数学课,我们总是被告知不要除以0,因为它是未定义的。原因是限制如何运作,还有一些我们不会讨论的其他原因。现在,让我们看看这个方法的其他问题:functionsswapWithMulDiv(num1,num2){console.log(num1,num2)num1num1=num1*num2num2=num1/num2num1num1=num1/num2console.log(num1,num2)}swapWithMulDiv(2.34,Infinity)//2.34Infinity//NaNNaN又是NaN,因为我们不能把Infinity除以任务内容,所以未定义?。如果是负无穷大,结果会是什么:2.34,-Infinity)-Infinity与前面的例子有相同的结果,并且原因相同。下面是上面的简写方式,当然问题是一样的:num1/num2控制台。log(num1,num2)}swapWithMulDivShort(2.3,3.4)5.仅使用*或/运算符上面的程序可以运行,但会降低可读性。在()中,我们将num1赋值给num2,旁边的1``就是返回值。num2=num1*(num1=num2,1)看起来像这样:num2=num1*1=>num2=num16。当我们有两个不相同的值时,使用按位异或异或,其结果为1,否则为0:functionsswapWithXOR(num1,num2){console.log(num1,num2)num1num1=num1^num2;num2=num1^num2;num1num1=num1^num2;console.log(num1,num2)}swapWithXOR(10,1)4位二进制数10->10104位二进制数1->0001上面的分解过程:num1num1=num1^num2=1010^0001=1011num2=num1^num2=1011^0001=>1010=>10num1num1=num1^num2=1011^1010=>0001=>1让我们看另一个例子。函数swapWithXOR(num1,num2){console.log(num1,num2)num1num1=num1^num2;num2=num1^num2;num1num1=num1^num2;console.log(num1,num2)}swapWithXOR(2.34,3.45)//2.343.45//32嗯?交换的价值在哪里?我们只得到数字的整数部分。这就是问题所在。XOR假设输入是整数,所以执行相应的计算。但浮点数不是整数,由IEEE754标准表示,它将数字分为三部分:一个符号位,一组表示指数的位,以及另一组介于1(含)和2之间的位(独家的),所以我们得到不正确的值。另一个例子:functionswapWithXOR(num1,num2){console.log(num1,num2)num1num1=num1^num2;num2=num1^num2;num1num1=num1^num2;console.log(num1,num2)}swapWithXOR(-Infinity,Infinity)//-InfinityInfinity//00同样,我们没有看到预期的结果。这是因为Infinity和–Infinity都是浮点数。正如我们上面所讨论的,浮点数是XOR的一个问题。使用相同的或门XNOR。或非门也叫异或门,它也可以对二进制位进行运算,与异或相反。当我们有两个不相同的值时,XNOR结果为0,否则为1。JavaScript没有执行XNOR的运算符,因此我们使用NOT-ANDXOR运算符来实现类似的效果。函数swapWithXNOR(num1,num2){console.log(num1,num2)num1=~(num1^num2)num2=~(num1^num2)num1=~(num1^num2)console.log(num1,num2)}swapWithXNOR(10,1)四位二进制数10->1010四位二进制数1->0001上面的分解过程:num1=~(num1^num2)=>~(1010^1011)=>~(1011)=>~11=>-12由于我们有一个负数,所以我们需要将其转换回二进制并进行2的补码得到十进制值,例如:-12=>1100=>0011+1=>0100num2=~(num1^num2)=>~(0100^0001)=>~(0101)=>~5=>-6-6=>0110=>1001+1=>1010=>10num1=~(num1^num2)=>~(0100^1010)=>~(1110)=>~14=>-15-15=>1111=>0000+1=>0001=>1花了一些时间,但我们交换了值。但不幸的是,它遇到了与XOR相同的问题,无法处理浮点数和无穷大。函数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)//2.34.5//428。在数组中赋值这是一个简单的技巧,只需要一行代码就可以执行交换,更重要的是不需要数学知识,只需要有数组的基础知识。函数swapWithArray(num1,num2){console.log(num1,num2)num2=[num1,num1=num2][0]console.log(num1,num2)}swapWithArray(2.3,Infinity)//2.3Infinity//Infinity2.3在数组的索引0中,我们存储num1,在索引1中,我们将num2分配给num1并存储num2。此外,访问[0]会将数组中的num1值存储在num2中。这样我们就可以交换我们想要的任何东西,包括整数、浮点数(包括无穷大)和字符串,它很整洁,但不是那么清晰。9、使用解构表达式这是ES6的特性,也是最简单的,我们可以这样交换值:letnum1=23.45letnum2=45.67console.log(num1,num2)[num1,num2]=[num2,num1]console.log(num1,num2)10.使用ImmediatelyInvokedFunctionExpression(IIFE)IIFE是指定义后立即执行的函数。functionswapWithIIFE(num1,num2){console.log(num1,num2)num1=(function(num2){returnnum2;})(num2,num2=num1)console.log(num1,num2)}swapWithIIFE(2.3,3.4)在在上面的例子中,我们在第4行立即调用了一个函数。最后的括号是函数的参数。第二个参数将num1赋值给num2,返回第一个参数num1。所以交换值,记住这种交换方法不是很有效。本文转载自微信公众号《伟大的走向世界》,您可以通过以下二维码关注。转载请联系****公众号。
