您好,登錄后才能下訂單哦!
JavaScript交換值的方法有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
早期之前,在 JS 中交換值,我們主要還是使用臨時變量。ES6 之后,我們可以使用展開運算符號來交換變量,除了這兩種方式,你還能想到哪些呢?
1. 使用臨時變量
function swapWithTemp(num1, num2) { console.log(num1, num2) let temp = num1 num1 = num2 num2 = temp console.log(num1, num2) }swapWithTemp(66.66, 8.88)
2. 使用算術運算符+和-
function swapWithPlusMinus(num1, num2){ console.log(num1, num2) num1num1 = num1 + num2 num2 = num1 - num2 num1num1 = num1 - num2 console.log(num1, num2) }swapWithPlusMinus(66, 8)
主要的過程是這樣的,先求出兩個數的和,那么第二個數要換友第一個數的的值就是總的和減去第二個,也就是代碼中的 num2 = num1-num2,同理,第一個數要換成第二個數的值,就是總的和減去第一個數的值,現在第一個數已經是賦值給第二個數,所以直接減去第二數的值即可,也就是 num1 = num1-num2
但我試了一下小數,好像有點問題,有點尷尬 ,但這種思想我們還是要掌握的
上面還可以這樣來簡寫 :
function swapWithPlusMinusShort(num1, num2){ console.log(num1, num2) num2 = num1 + (num1 = num2) - num2 console.log(num1, num2) }
這里的技巧在于 (num1 = num2) ,這步,我們讓 num1 等于 num2了,并且返回是num2 的值,此時 num1 值已交換。接著就用 num1 加上 (num1 = num2) 返回的值,也就是 num1 + num2 求和,然后思路就和上面分析的一樣了 。
但是,使用浮點數時,也會得到一些意外的結果
你可以在控制臺跑跑下面這段代碼:
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) }swapWithPlus(2.3,3.4)
上面的程序可以工作,但犧牲了可讀性。在()中,我們將num1分配給num2,旁邊的0是返回值。簡而言之,第4行看起來是這樣的:
num2 = num1 + 0 => num2 = num1
4. 使用算術運算符*和/
*和/的原理與先前的方法相同,只是有一些微小的區別 。
function swapWithMulDiv(num1, num2){ console.log(num1, num2) num1num1 = num1*num2 num2 = num1/num2 num1num1 = num1/num2 console.log(num1, num2) }swapWithMulDiv(2.3,3.4)
與上一個相同。我們得到兩個數字的乘積并將它們存儲在其中一個變量中,對應就是num1 = num1*num2。然后,用總數除了對應的變量,得到交換后變量的值 。
但這個有些問題是什么呢?就是,如果有交換值有 0 就會得到意想不到的問題 :
swapWithMulDiv(2.34,0) // 2.34 0 // NaN NaN
我們的值沒有交換,而是得到一個奇怪的NaN。那是怎么回事?如果你還記得你的數學課,我們總是被告知不要除以0因為它是未定義。原因在于極限是如何起作用的,還有一些其他的原因,我們不會涉及。現在,讓我們看看這個方法的其他問題:
function swapWithMulDiv(num1, num2){ console.log(num1, num2) num1num1 = num1*num2 num2 = num1/num2 num1num1 = num1/num2 console.log(num1, num2) }swapWithMulDiv(2.34,Infinity) // 2.34 Infinity // NaN NaN
又是NaN,因為我們不能用Infinity除以任務內容,因此未定義 ?。
如果是負無窮大呢,結果又會是怎么樣 :
function swapWithMulDiv(num1, num2){ console.log(num1, num2) num1num1 = num1*num2 num2 = num1/num2 num1num1 = num1/num2 console.log(num1, num2) }swapWithMulDiv(2.34,-Infinity)
-Infinity的結果與前面的示例相同,原因也是一樣的。
下面是上面的一個簡寫方式,當然存在問題也是一樣的:
function swapWithMulDivShort(num1, num2){ console.log(num1, num2) num1num1 = num1*num2 num2 = num1*(num1=num2)/num2 num1num1 = num1/num2 console.log(num1, num2) }swapWithMulDivShort(2.3,3.4)
5. 僅使用*或/運算符
上面的程序可以工作,但犧牲了可讀性。在()中,我們將num1分配給num2,旁邊的1``是返回值。num2 = num1 * (num1=num2, 1)看起來是這樣的:
num2 = num1 * 1 => num2 = num1
6. 使用按位異或
異或是按二進制位來工作,當我們有兩個值不一樣時,它的結果為1,否則為0:
function swapWithXOR(num1, num2){ console.log(num1, num2) num1num1 = num1^num2; num2 = num1^num2; num1num1 = num1^num2; console.log(num1, num2) }swapWithXOR(10,1)
4位二進制數10-> 1010
4位二進制數1-> 0001
上面的分解過程 :
num1num1 = num1 ^ num2 = 1010 ^ 0001 = 1011 num2 = num1 ^ num2 = 1011 ^ 0001 => 1010 => 10 num1num1 = num1 ^ num2 = 1011 ^ 1010 => 0001 => 1
我們來看另一個例子。
function 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.34 3.45 // 3 2
嗯?交換的值在哪里?我們只得到這個數的整數部分。這就是問題所在。異或假設輸入是整數,因此執行相應的計算。但是浮點數不是整數,并且由IEEE 754標準來表示,該標準將數字分為三部分:一個符號位、一組表示指數的位以及另一組表示1(包括)到2(不包括)之間的數字尾數,因此我們得到了不正確的值。
另一個例子:
function swapWithXOR(num1, num2){ console.log(num1, num2) num1num1 = num1^num2; num2 = num1^num2; num1num1 = num1^num2; console.log(num1, num2) }swapWithXOR(-Infinity,Infinity) // -Infinity Infinity // 0 0
再一次,我們沒有看到預期的結果 。這是因為Infinity和–Infinity都是浮點數。正如我們上面討論的,對于XOR,浮點數是一個問題。
使用同或門 XNOR。
同或門也稱為異或非門,它也可以操作二進制位,與XOR相反。當我們有兩個值不一樣時,XNOR 結果是0,否則為1。JavaScript 沒有一個操作符來執行XNOR,所以我們使用非與XOR操作符來達到類似的效果。
function 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-> 1010
4位二進制數1-> 0001
上面的分解過程 :
num1 = ~(num1 ^ num2) => ~(1010 ^ 1011)=> ~(1011) => ~11 => -12
由于我們有一個負數,我們需要將其轉換回二進制并執行2的補碼以獲取十進制值,例如:
-12 => 1100 => 0011 + 1 => 0100
num2 = ~(num1 ^ num2) => ~(0100 ^ 0001) => ~(0101) => ~5 => -6 -6 => 0110 => 1001 + 1 => 1010 => 10
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) // 2.3 4.5 // 4 2
8. 在數組中賦值
這是一個簡單的技巧,只需要一行來執行交換,更重要的是不需要數學知識,只需要一個基本的數組知識即可。
function swapWithArray(num1, num2){ console.log(num1, num2) num2 = [num1, num1 = num2][0] console.log(num1, num2)}swapWithArray(2.3,Infinity)// 2.3 Infinity// Infinity 2.3
在數組的索引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)
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交換值的方法有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。