亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript中交換值的10種方法總結

 更新時間:2020年08月18日 15:01:32   作者:瘋狂的技術宅  
這篇文章主要給大家總結介紹了JavaScript中交換值的10種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用JavaScript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

在開發(fā)過程中又是我們需要對值進行交換。一般我們都在用一種簡單的解決方案:“臨時變量”。不過還有更好的辦法,而且不只有一個,有很多。有時我們在網上搜尋解決方案,找到后復制粘貼,但是從沒想過這小段代碼是怎樣工作的。現(xiàn)在我們該學習一下應該怎樣輕松高效地交換值了。

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 行獲得兩個數字的總和?,F(xiàn)在,如果從和中減去一個數字,那么另一個數字就正確了。這就是第 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 之外什么也沒有做,因此得到了結果。但是當使用浮點數時,會看到一些意外的結果。

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

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 引擎可能會對上面的代碼進行優(yōu)化,從而忽略 + 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)

與上一個方法相同。首先得到兩個數字的乘積,并將它們存儲在 num1 中。然后在第 5 行,把 num2 與這個結果相除,得到第一個數字,然后重復此過程以獲得第二個數字。

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

不過那小問題在哪兒呢?

讓我們來嘗試一下:

function swapWithMulDiv(num1,num2){
 console.log(num1,num2)

 num1 = num1*num2;
 num2 = num1/num2;
 num1 = num1/num2;

 console.log(num1,num2)
}

//試著改變數字的值,看看會發(fā)生什么
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)
}
//看看會發(fā)生什么
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)
}

//會怎樣呢
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)。

XOR 用來進行二進制位運算。當有兩個不同的輸入時,它的結果為 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)
}
// 試試負值會怎樣
swapWithXOR(10,1)

10 的4 位二進制數 -> 1010

1 的 4 位二進制數 -> 0001

現(xiàn)在:

第四行: 
num1 = num1 ^ num2 
 => 1010 ^ 0001 
 => 1011 
 => 7 
第五行: 
num2 = num1 ^ num2 
 => 1011 ^ 0001 
 => 1010 
 => 10
第六行: 
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(2.34,3.45)

嗯??交換的值在哪兒?我們只是得到了數字的整數部分,這就是問題所在。 XOR 假定輸入是整數,所以···相應地執(zhí)行計算。但是浮點數不是整數,而是由 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)
}
// 試試 infinities 和整數值.
swapWithXOR(-Infinity,Infinity)

毫無意外,我們沒有得到預期的結果。這是因為 Infinity 和 – Infinity 都是浮點數。正如我們在前面所討論的,對于 XOR,浮點數是一個問題。

7 使用按位同或 (XNOR)

它用來進行二進制位運算,但是與 XOR 正好相反。當有兩個不同的輸入時,XNOR 的結果是 0,否則結果為 1。 JavaScript 沒有執(zhí)行 XNOR 的運算符,所以要用 NOT 運算符對 XOR 的結果求反。

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

//可以試試負值
swapWithXNOR(10,1)

10 的 4 位二進制數 -> 1010

1 的 4 位二進制數 -> 0001

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

這是最奇怪的一個。簡單的說 IIFE 是在在定義后立即執(zhí)行的函數。

可以用它來交換兩個值:

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,僅僅返回第一個參數,不過這種交換方法效率不高。

總結

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

到此這篇關于JavaScript中交換值的10種方法就介紹到這了,更多相關JavaScript交換值方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 原生js代碼能實現(xiàn)call和bind嗎

    原生js代碼能實現(xiàn)call和bind嗎

    這篇文章主要介紹了原生js代碼能實現(xiàn)call和bind嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 微信小程序和公眾號實現(xiàn)簽到頁面

    微信小程序和公眾號實現(xiàn)簽到頁面

    這篇文章主要為大家詳細介紹了微信小程序和公眾號實現(xiàn)簽到頁面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • JavaScript 事件記錄使用說明

    JavaScript 事件記錄使用說明

    JavaScript 事件記錄使用說明需要的朋友可以參考下。
    2009-10-10
  • js實現(xiàn)動態(tài)創(chuàng)建的元素綁定事件

    js實現(xiàn)動態(tài)創(chuàng)建的元素綁定事件

    下面小編就為大家?guī)硪黄猨s實現(xiàn)動態(tài)創(chuàng)建的元素綁定事件。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 用倒置濾鏡把div倒置,再把table倒置。

    用倒置濾鏡把div倒置,再把table倒置。

    用倒置濾鏡把div倒置,再把table倒置。...
    2007-07-07
  • javascript 根據歌名獲取播放地址和歌詞內容

    javascript 根據歌名獲取播放地址和歌詞內容

    在前幾天做在線聽歌的過程中,碰到了根據歌名獲取播放地址和LRC文件內容的問題,今晚花了幾個小時把接口整理了一下
    2009-06-06
  • ES6中參數的默認值語法介紹

    ES6中參數的默認值語法介紹

    這ES6允許為函數參數設置默認值,即直接寫在參數定義后面。下面篇文章主要介紹了ES6中參數默認值語法的相關資料,對大家具有一定的參考價值,需要的朋友下面來一起看看吧。
    2017-05-05
  • JS中Select下拉列表類(支持輸入模糊查詢)功能

    JS中Select下拉列表類(支持輸入模糊查詢)功能

    這篇文章主要介紹了JS中Select下拉列表類(支持輸入模糊查詢)功能,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-01-01
  • layui(1.0.9)文件上傳upload,前后端的實例代碼

    layui(1.0.9)文件上傳upload,前后端的實例代碼

    今天小編就為大家分享一篇layui(1.0.9)文件上傳upload,前后端的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • javascript實現(xiàn)別踩白塊兒小游戲程序

    javascript實現(xiàn)別踩白塊兒小游戲程序

    我們先看到的未開始的頁面黑色和白色方塊是隨機生成的,完了這么多把沒有發(fā)現(xiàn)時固定不變的。點擊一次方塊,程序需要判斷是黑色還是白色的。如果是黑色的,當然程序也是實現(xiàn)了一次自減,在動畫中是實現(xiàn)一次下移的,下移的時候點擊的方塊到黃顏色的區(qū)域會變成灰色
    2015-11-11

最新評論