日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaScript中交換值的10種方法總結(jié)

瀏覽:59日期:2023-06-18 08:11:36

前言

在開(kāi)發(fā)過(guò)程中又是我們需要對(duì)值進(jìn)行交換。一般我們都在用一種簡(jiǎn)單的解決方案:“臨時(shí)變量”。不過(guò)還有更好的辦法,而且不只有一個(gè),有很多。有時(shí)我們?cè)诰W(wǎng)上搜尋解決方案,找到后復(fù)制粘貼,但是從沒(méi)想過(guò)這小段代碼是怎樣工作的。現(xiàn)在我們?cè)搶W(xué)習(xí)一下應(yīng)該怎樣輕松高效地交換值了。

1 使用臨時(shí)變量

先是最簡(jiǎn)單的一種。

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 使用算術(shù)運(yùn)算符 + 和 -

還可以用一些數(shù)學(xué)魔術(shù)來(lái)交換值。

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)

讓我們來(lái)看看它是如何工作的。我們?cè)诘?4 行獲得兩個(gè)數(shù)字的總和。現(xiàn)在,如果從和中減去一個(gè)數(shù)字,那么另一個(gè)數(shù)字就正確了。這就是第 5 行所做的工作。從存儲(chǔ)在 num1 變量中的總和中減去 num2 會(huì)得到存儲(chǔ)在 num2 中的原始 num1 值。同樣,在第 6 行的 num1 中得到 num2 的值。

小心:還有一個(gè)與 + 和 - 互換的單行代碼方案,不過(guò)。。。

它是這樣的:

function swapWithPlusMinusShort(num1,num2){ console.log(num1,num2) num2 = num1+(num1=num2)-num2; console.log(num1,num2)}swapWithPlusMinusShort(2,3)

上面的代碼給出了預(yù)期的結(jié)果。 () 中的表達(dá)式將 num2 存儲(chǔ)在 num1 中,然后減去 num1 - num2,除了減去 num2 - num2 = 0 之外什么也沒(méi)有做,因此得到了結(jié)果。但是當(dāng)使用浮點(diǎn)數(shù)時(shí),會(huì)看到一些意外的結(jié)果。

試著執(zhí)行下面的代碼并查看結(jié)果:

function swapWithPlusMinusShort(num1,num2){ console.log(num1,num2) num2 = num1+(num1=num2)-num2; console.log(num1,num2)}swapWithPlusMinusShort(2,3.1)

3 僅使用 + 或 - 運(yùn)算符

僅通過(guò)使用 + 運(yùn)算符就可以達(dá)到同時(shí)使用 + 和 - 相同的結(jié)果。

看下面的代碼:

function swapWithPlus(num1,num2){ console.log(num1,num2) num2 = num1 + (num1=num2, 0) console.log(num1,num2)}//Try with - operatorswapWithPlus(2.3,3.4)

上面的代碼是有效的,但犧牲了可讀性。在第 4 行的 () 中,我們將 num1 賦值給 num2,而旁邊的 0 是返回值。簡(jiǎn)而言之,第 4 行的運(yùn)算邏輯如下所示:

num2 = num1 + 0 => num2 = num1.

所以得到了正確結(jié)果。

注意:一些 JavaScript 引擎可能會(huì)對(duì)上面的代碼進(jìn)行優(yōu)化,從而忽略 + 0。

4 使用算術(shù)運(yùn)算符 * 和 /

讓我們用 * 和/ 運(yùn)算符玩更多的花樣。

其原理與先前的方法相同,但是有一些小問(wèn)題。

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)

與上一個(gè)方法相同。首先得到兩個(gè)數(shù)字的乘積,并將它們存儲(chǔ)在 num1 中。然后在第 5 行,把 num2 與這個(gè)結(jié)果相除,得到第一個(gè)數(shù)字,然后重復(fù)此過(guò)程以獲得第二個(gè)數(shù)字。

現(xiàn)在你成“數(shù)學(xué)家” 了。

不過(guò)那小問(wèn)題在哪兒呢?

讓我們來(lái)嘗試一下:

function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2)}//試著改變數(shù)字的值,看看會(huì)發(fā)生什么swapWithMulDiv(2.34,0)

我們的值沒(méi)有交換,而是得到了一個(gè)奇怪的 NaN,這是怎么回事。如果你還記得小學(xué)的數(shù)學(xué)課,就會(huì)想起不要除以 0,因?yàn)槟鞘菦](méi)有意義的。

然后再看看這種方法的其他問(wèn)題,看下面的代碼:

function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2)}//看看會(huì)發(fā)生什么swapWithMulDiv(2.34,Infinity)

沒(méi)錯(cuò),又是 NaN。因?yàn)槟銦o(wú)法使用 Infinity 去除任何值,它是未定義的。

但我還想再試試:

function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2)}//會(huì)怎樣呢swapWithMulDiv(2.34,-Infinity)

-Infinity 的結(jié)果與前面的代碼相同,原因也一樣。

事實(shí)證明,即使你是一位出色的“數(shù)學(xué)家”,也有無(wú)能為力的時(shí)候。

下面是用 * 和 / 進(jìn)行值交換的較短版本,仍存在相同的問(wèn)題:

function swapWithMulDivShort(num1,num2){ console.log(num1,num2) num2 = num1*(num1=num2)/num2; console.log(num1,num2)}swapWithMulDivShort(2.3,3.4)

上面的代碼類(lèi)似于用 + 和 - 進(jìn)行交換時(shí)的較短的代碼。把 num2 賦值給 num1,然后第 4 行的演算邏輯是這樣:

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

這樣兩個(gè)值就互換了。

5)僅使用 * 或 / 運(yùn)算符

function swapWithMul(num1,num2){ console.log(num1,num2) num2 = num1 * (num1=num2, 1) console.log(num1,num2)}//Try with / and ** operatorswapWithMul(2.3,3.4)

上面的程序是有效的,但犧牲了可讀性。在第 4 行的 () 中,我們將 num1 賦值給 num2,旁邊的 1 是返回值。簡(jiǎn)而言之,第 4 行的邏輯如下所示:

num2 = num1 * 1 => num2 = num1

這樣就得到了結(jié)果。

6 使用按位異或(XOR)。

XOR 用來(lái)進(jìn)行二進(jìn)制位運(yùn)算。當(dāng)有兩個(gè)不同的輸入時(shí),它的結(jié)果為 1,否則為 0。

X Y X^Y 1 1 0 1 0 1 0 1 1 0 0 0

先了解其工作原理!

function swapWithXOR(num1,num2){ console.log(num1,num2) num1 = num1^num2; num2 = num1^num2; num1 = num1^num2; console.log(num1,num2)}// 試試負(fù)值會(huì)怎樣swapWithXOR(10,1)

10 的4 位二進(jìn)制數(shù) -> 1010

1 的 4 位二進(jìn)制數(shù) -> 0001

現(xiàn)在:

第四行: num1 = num1 ^ num2 => 1010 ^ 0001 => 1011 => 7 第五行: num2 = num1 ^ num2 => 1011 ^ 0001 => 1010 => 10第六行: num1 = num1 ^ num2 => 1011 ^ 1010 => 0001 => 1

兩個(gè)值交換了。

再來(lái)看另一個(gè)例子:

function 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)

嗯??交換的值在哪兒?我們只是得到了數(shù)字的整數(shù)部分,這就是問(wèn)題所在。 XOR 假定輸入是整數(shù),所以···相應(yīng)地執(zhí)行計(jì)算。但是浮點(diǎn)數(shù)不是整數(shù),而是由 IEEE 754 標(biāo)準(zhǔn)表示的,將數(shù)字分為三部分:符號(hào)位、代表指數(shù)的一組位和代表尾數(shù)的一組位。位數(shù)是介于1(含)和2(不含)之間的數(shù)字。所以得到的值不正確。

另一個(gè)例子:

function swapWithXOR(num1,num2){ console.log(num1,num2) num1 = num1^num2; num2 = num1^num2; num1 = num1^num2; console.log(num1,num2)}// 試試 infinities 和整數(shù)值.swapWithXOR(-Infinity,Infinity)

毫無(wú)意外,我們沒(méi)有得到預(yù)期的結(jié)果。這是因?yàn)?Infinity 和 ? Infinity 都是浮點(diǎn)數(shù)。正如我們?cè)谇懊嫠懻摰模瑢?duì)于 XOR,浮點(diǎn)數(shù)是一個(gè)問(wèn)題。

7 使用按位同或 (XNOR)

它用來(lái)進(jìn)行二進(jìn)制位運(yùn)算,但是與 XOR 正好相反。當(dāng)有兩個(gè)不同的輸入時(shí),XNOR 的結(jié)果是 0,否則結(jié)果為 1。 JavaScript 沒(méi)有執(zhí)行 XNOR 的運(yùn)算符,所以要用 NOT 運(yùn)算符對(duì) XOR 的結(jié)果求反。

X Y XNOR 1 1 1 1 0 0 0 1 0 0 0 1

先了解其工作原理:

function swapWithXNOR(num1,num2){ console.log(num1,num2) num1 = ~(num1^num2); num2 = ~(num1^num2); num1 = ~(num1^num2); console.log(num1,num2)}//可以試試負(fù)值swapWithXNOR(10,1)

10 的 4 位二進(jìn)制數(shù) -> 1010

1 的 4 位二進(jìn)制數(shù) -> 0001

第 4 行:

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

由于這是一個(gè)負(fù)數(shù),所以需要將其轉(zhuǎn)換回二進(jìn)制并計(jì)算 2 的補(bǔ)碼來(lái)獲取十進(jìn)制值,例如:

-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

花了一些時(shí)間,但還是交換了值。但不幸的是,它遇到了與 XOR 相同的問(wèn)題,不能處理浮點(diǎn)數(shù)和無(wú)窮大。

試試下面的值:

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 在數(shù)組中進(jìn)行賦值

這是一線技巧。只需要一行代碼就可以進(jìn)行交換,更重要的是,無(wú)需數(shù)學(xué)運(yùn)算,只需要數(shù)組的基本知識(shí)。不過(guò)它看上去可能很奇怪。

先讓看看它的實(shí)際效果:

function swapWithArray(num1,num2){ console.log(num1,num2) num2 = [num1, num1 = num2][0]; console.log(num1,num2)}swapWithArray(2.3,Infinity)

在數(shù)組的下標(biāo) 0 位置中存儲(chǔ) num1,在下標(biāo) 1 中,既將 num2 分配給 num1,又存儲(chǔ)了 num2。另外,我們只是訪問(wèn) [0],將數(shù)組中的 num1 值存儲(chǔ)在 num2 中。而且可以在這里交換我們想要的任何東西,比如:整數(shù)、浮點(diǎn)數(shù)(包括無(wú)窮數(shù))以及字符串。看上去很整潔,但是在這里失去了代碼的清晰度。

9 使用解構(gòu)表達(dá)式

這是 ES6 的功能。這是所有方法中最簡(jiǎn)單的。只需要一行代碼就可以完成交換:

let num1 = 23.45;let num2 = 45.67;console.log(num1,num2);[num1,num2] = [num2,num1];console.log(num1,num2);

10、使用立即調(diào)用的函數(shù)表達(dá)式(IIFE)

這是最奇怪的一個(gè)。簡(jiǎn)單的說(shuō) IIFE 是在在定義后立即執(zhí)行的函數(shù)。

可以用它來(lái)交換兩個(gè)值:

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行立即調(diào)用一個(gè)函數(shù)。最后的括號(hào)是該函數(shù)的參數(shù)。第二個(gè)參數(shù)將 num1 賦值給 num2,僅僅返回第一個(gè)參數(shù),不過(guò)這種交換方法效率不高。

總結(jié)

本文探討了用于在 JavaScript 中對(duì)值進(jìn)行交換的眾多方法。希望對(duì)你有所幫助!

到此這篇關(guān)于JavaScript中交換值的10種方法就介紹到這了,更多相關(guān)JavaScript交換值方法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美一区二区三区在线视频 | 午夜久久av| 国产精品一区二区三区av| 亚洲精品在线二区| 国产视频一区二| 综合欧美亚洲| 亚洲免费中文| 久久久影院免费| 日韩三区免费| 国产尤物精品| 九色porny丨国产首页在线| 国产麻豆精品| 久久中文亚洲字幕| 日韩精品乱码av一区二区| 国产视频一区二区在线播放| 麻豆视频久久| 国产精品精品国产一区二区| 国产精品伦一区二区| 成人精品中文字幕| 欧美精品一区二区三区精品| 国产日韩高清一区二区三区在线| 蜜桃视频在线网站| 欧美高清不卡| 国产视频一区二| 免费成人网www| 国产精品夜夜夜| 首页亚洲欧美制服丝腿| 精品久久91| 久久精品99国产精品日本| 99久久亚洲精品| 国产精品一区2区3区| 亚洲精品在线观看91| 91成人小视频| 午夜在线精品偷拍| 欧美成人基地 | 国产探花在线精品| 国精品一区二区三区| 91精品国产自产精品男人的天堂| 日韩成人综合| 午夜久久av| 美女久久久久| yellow在线观看网址| 日韩高清三区| 欧美一区三区| 神马久久午夜| 美女视频一区在线观看| 91国内精品| 日韩福利视频一区| 午夜亚洲福利| 亚洲综合五月| 爽爽淫人综合网网站| 一本色道精品久久一区二区三区| 亚洲第一精品影视| 久久精品免费一区二区三区| 久久精品国产网站| 欧美日韩1区2区3区| 日韩综合小视频| 日本一不卡视频| 日本不卡一区二区三区| 免费视频一区二区| 亚洲深夜福利在线观看| 国产91一区| 91成人在线网站| 国产精品nxnn| 国产成人精品亚洲线观看 | 亚洲欧美综合| 丝袜美腿一区二区三区| 亚洲天堂免费电影| 不卡中文字幕| 快she精品国产999| 国产探花在线精品| 91欧美国产| 亚洲精品极品少妇16p| 国产视频一区免费看| 五月综合激情| 亚洲精品在线国产| 久久久久亚洲精品中文字幕| а√在线中文在线新版| 亚洲激情中文| 久久狠狠久久| 欧美成人日韩| 美女视频黄免费的久久| 粉嫩av一区二区三区四区五区 | 91精品日本| 久久视频一区| 羞羞答答国产精品www一本| 四虎在线精品| 久久不见久久见中文字幕免费| 精品久久一区| 久久香蕉精品| 精品久久中文| 蜜臀a∨国产成人精品| 精品国产亚洲一区二区三区| 亚洲91视频| 免费成人在线视频观看| 久久精品国产网站| 石原莉奈一区二区三区在线观看| 久久精品xxxxx| 午夜久久黄色| 久久99国产精品视频| 亚洲欧美日韩国产| 中文字幕在线视频久| 日本伊人久久| 亚洲二区在线| 国产精品成人国产| 国产农村妇女精品一区二区| 国产精品一国产精品k频道56| 亚洲精品2区| 999精品色在线播放| 日韩va亚洲va欧美va久久| 久久一级电影| 九九久久国产| 青青青国产精品| 日韩网站在线| 99久久精品网| 日韩精品诱惑一区?区三区| 国产精品久久久久久av公交车| 日韩一区精品视频| 99久久夜色精品国产亚洲1000部| 国产日韩一区二区三区在线| 亚洲欧美日韩国产一区| 国内精品福利| 亚洲性图久久| 在线日韩av| 97精品视频在线看| 久久国产精品美女| 国产伦理一区| 国产精品自拍区| 国产丝袜一区| 国产精品99久久免费| 国产探花在线精品| 国产精品久久亚洲不卡| 97久久亚洲| 国产精品久久久久久久久久久久久久久 | 欧美亚洲国产一区| 精品国产亚洲一区二区三区| 国产精品色在线网站| 亚洲三级国产| 日本免费新一区视频| 国产三级一区| 麻豆成人综合网| 国产精品久久久久久久久久久久久久久 | 日韩欧美字幕| 999国产精品| 五月天久久777| 亚洲欧美日韩精品一区二区| 日韩中文字幕在线一区| 91嫩草精品| 国产精品亚洲产品| 国产美女久久| 精品一区二区三区中文字幕视频 | 日韩不卡免费高清视频| 国产一区二区亚洲| 国精品产品一区| 欧美久久精品一级c片| 视频一区中文字幕精品| 国产精品videossex| av在线最新| 久久高清国产| 久久精品一区| 欧美精品一二| 国产欧美日韩精品一区二区免费| 最新中文字幕在线播放| 综合色就爱涩涩涩综合婷婷| 国产一区三区在线播放| 视频一区欧美日韩| 国产va免费精品观看精品视频| 日韩成人精品一区| 国产农村妇女精品一二区| 国产精品久久久亚洲一区| 欧美sss在线视频| 日韩亚洲精品在线观看| 香蕉成人av| 久久精品97| 在线国产日韩| 婷婷久久一区| 91视频久久| 国产精成人品2018| 视频精品一区二区| 欧美韩日一区| 国产精品白丝一区二区三区| 亚洲资源av| 亚洲深夜视频| 国产激情综合| 国产欧美日本| 日韩二区在线观看| 亚洲天堂日韩在线| 国产精品老牛| 国产精品99免费看| 999国产精品视频| 日韩三区免费| 日韩精品一卡| 国产综合色区在线观看| 国产日韩电影| 欧洲一区二区三区精品| 日韩欧美三级| 美女网站视频一区| av最新在线| 日韩一区电影| 日本欧美不卡|