当前位置: 首页 > Web前端 > HTML

JavaScript中交换价值的奇思妙想

时间:2023-04-02 21:58:29 HTML

作者:piyush-kochhar译者:前端小智来源:hackernoon点赞再看,微信搜索【伟大的走向世界】关注这个没有背景的a大厂,却有着积极向上的心态的人。本文已收录到GitHubhttps://github.com/qq44924588...,文章已分类,也整理了很多我的文档和教程资料。大家都说简历里没项目可写,所以给大家找了一个项目,还给了一个【搭建教程】。早期之前,我们在JS中交换值的时候,主要是使用临时变量。在ES6之后,我们可以使用扩展运算符来交换变量。除了这两种方式,你还能想到什么??本文主要介绍10种交换变量的方法。请阅读。1.使用临时变量functionswapWithTemp(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)num1=num1+num2num2=num1-num2num1=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)}这里的技巧是(数1=数2)。在这一步中,我们使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.仅使用+或-运算符只需使用+运算符即可获得与同时使用+和-?相同的结果。functionswapWithPlus(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)num1=num1*num2num2=num1/num2num1=num1/num2console.log(num1,num2)}swapWithMulDiv(2.3,3.4)同前一个.我们得到两个数字的乘积,并将它们存储在其中一个变量中,对应于num1=num1*num2。然后,将相应的变量除以总数得到变量的值?交换后。但这是什么问题?也就是说,如果交换值为0,我们会遇到意想不到的问题?:swapWithMulDiv(2.34,0)//2.340//NaNNaN而不是交换我们的值,我们得到了一个奇怪的NaN。所以发生了什么事?如果你还记得你的数学课,我们总是被告知不要除以0,因为它是未定义的。原因是限制如何运作,还有一些我们不会讨论的其他原因。现在,让我们看看这个方法的其他问题:swapWithMulDiv(2.34,Infinity)//2.34Infinity//NaNNaN又是NaN,因为我们不能将Infinity除以任务内容,所以未定义?。如果是负无穷大,结果会是什么?:num2)}swapWithMulDiv(2.34,-Infinity)-Infinity的结果与前面的示例相同,原因相同。下面是上面的简写方式,当然问题是一样的:num2num1=num1/num2console.log(num1,num2)}swapWithMulDivShort(2.3,3.4)5.仅使用*或/运算符上面的程序可以运行,但会降低可读性。在()中,我们将num1赋值给num2,后面的1`就是返回值。num2=num1*(num1=num2,1)`看起来像这样:num2=num1*1=>num2=num16。当我们有两个不相同的值时,使用按位异或逐位工作当它们相同时,其结果为1,否则为0:functionswapWithXOR(num1,num2){console.log(num1,num2)num1=num1^num2;num2=num1^num2;num1=num1^num2;console.log(num1,num2)}swapWithXOR(10,1)4位二进制数10->10104位二进制数1->0001上面的分解过程?:num1=num1^num2=1010^0001=1011num2=num1^num2=1011^0001=>1010=>10num1=num1^num2=1011^1010=>0001=>1让我们看另一个例子。函数swapWithXOR(num1,num2){console.log(num1,num2)num1=num1^num2;num2=num1^num2;num1=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)num1=num1^num2;num2=num1^num2;num1=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)4位二进制数10->10104位二进制数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.在数组中赋值这是一个简单的技巧,只需要一行就可以执行交换,更重要的是不需要数学知识,只需要数组的基础知识是必须的。functionswapWithArray(num1,num2){console.log(num1,num2)num2=[num1,num1=num2][0]console.log(num1,num2)}swapWithArray(2.3,Infinity)//2.3无穷大//无穷大2.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。使用立即调用的函数表达式(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。所以交换值,记住这种交换方法不是很有效。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。原文:https://hackernoon.com/how-to...每周更新交流文章。可以微信搜索【大千世界】第一时间阅读,回复【福利】还有很多前端视频等着你。本文GitHubhttps://github.com/qq449245884/xiaozhi已收录,欢迎Star。