自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScript交換值的方法,你能想到幾種?

開發(fā) 前端
早期之前,在 JS 中交換值,我們主要還是使用臨時變量。ES6 之后,我們可以使用展開運算符號來交換變量,除了這兩種方式,你還能想到哪些呢?

早期之前,在 JS 中交換值,我們主要還是使用臨時變量。ES6 之后,我們可以使用展開運算符號來交換變量,除了這兩種方式,你還能想到哪些呢?

本文主要介紹 交換變量的 10 種方法,請過目!

[[342619]]

1. 使用臨時變量

  1. function swapWithTemp(num1, num2) { 
  2.   console.log(num1, num2) 
  3.   let temp = num1 
  4.   num1 = num2  num2 = temp  console.log(num1, num2) 
  5. }swapWithTemp(66.66, 8.88) 

2. 使用算術運算符+和-

  1. function swapWithPlusMinus(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1 + num2  num2 = num1 - num2  num1num1 = num1 - num2  console.log(num1, num2) 
  4. }swapWithPlusMinus(66, 8) 

主要的過程是這樣的,先求出兩個數(shù)的和,那么第二個數(shù)要換友第一個數(shù)的的值就是總的和減去第二個,也就是代碼中的 num2 = num1-num2,同理,第一個數(shù)要換成第二個數(shù)的值,就是總的和減去第一個數(shù)的值,現(xiàn)在第一個數(shù)已經(jīng)是賦值給第二個數(shù),所以直接減去第二數(shù)的值即可,也就是 num1 = num1-num2

但我試了一下小數(shù),好像有點問題,有點尷尬 ,但這種思想我們還是要掌握的

上面還可以這樣來簡寫 :

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

這里的技巧在于 (num1 = num2) ,這步,我們讓 num1 等于 num2了,并且返回是num2 的值,此時 num1 值已交換。接著就用 num1 加上 (num1 = num2) 返回的值,也就是 num1 + num2 求和,然后思路就和上面分析的一樣了 。

但是,使用浮點數(shù)時,也會得到一些意外的結(jié)果

你可以在控制臺跑跑下面這段代碼:

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

3. 僅使用+或-運算符

只要使用+運算符,就可以得到與同時使用+和-一樣的結(jié)果 。

  1. function swapWithPlus(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num2 = num1 + (num1=num2, 0) 
  4.   console.log(num1, num2) 
  5. }swapWithPlus(2.3,3.4) 

上面的程序可以工作,但犧牲了可讀性。在()中,我們將num1分配給num2,旁邊的0是返回值。簡而言之,第4行看起來是這樣的:

  1. num2 = num1 + 0 => num2 = num1 

4. 使用算術運算符*和/

*和/的原理與先前的方法相同,只是有一些微小的區(qū)別 。

  1. function swapWithMulDiv(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1*num2  num2 = num1/num2  num1num1 = num1/num2  console.log(num1, num2) 
  4. }swapWithMulDiv(2.3,3.4) 

與上一個相同。我們得到兩個數(shù)字的乘積并將它們存儲在其中一個變量中,對應就是num1 = num1*num2。然后,用總數(shù)除了對應的變量,得到交換后變量的值 。

但這個有些問題是什么呢?就是,如果有交換值有 0 就會得到意想不到的問題 :

  1. swapWithMulDiv(2.34,0) 
  2. // 2.34 0 
  3. // NaN NaN 

我們的值沒有交換,而是得到一個奇怪的NaN。那是怎么回事?如果你還記得你的數(shù)學課,我們總是被告知不要除以0因為它是未定義。原因在于極限是如何起作用的,還有一些其他的原因,我們不會涉及。現(xiàn)在,讓我們看看這個方法的其他問題:

  1. function swapWithMulDiv(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1*num2  num2 = num1/num2  num1num1 = num1/num2  console.log(num1, num2) 
  4. }swapWithMulDiv(2.34,Infinity) 
  5. // 2.34 Infinity 
  6. // NaN NaN 

又是NaN,因為我們不能用Infinity除以任務內(nèi)容,因此未定義 ⚡。

如果是負無窮大呢,結(jié)果又會是怎么樣 :

  1. function swapWithMulDiv(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1*num2  num2 = num1/num2  num1num1 = num1/num2  console.log(num1, num2) 
  4. }swapWithMulDiv(2.34,-Infinity) 

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

下面是上面的一個簡寫方式,當然存在問題也是一樣的:

  1. function swapWithMulDivShort(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1*num2  num2 = num1*(num1=num2)/num2  num1num1 = num1/num2  console.log(num1, num2) 
  4. }swapWithMulDivShort(2.3,3.4) 

5. 僅使用*或/運算符

上面的程序可以工作,但犧牲了可讀性。在()中,我們將num1分配給num2,旁邊的1``是返回值。num2 = num1 * (num1=num2, 1)看起來是這樣的:

  1. num2 = num1 * 1 => num2 = num1 

6. 使用按位異或

異或是按二進制位來工作,當我們有兩個值不一樣時,它的結(jié)果為1,否則為0:

  1. function swapWithXOR(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1^num2;  num2 = num1^num2;   num1num1 = num1^num2;  console.log(num1, num2) 
  4. }swapWithXOR(10,1) 
  • 4位二進制數(shù)10-> 1010
  • 4位二進制數(shù)1-> 0001

上面的分解過程 :

  1. num1num1 = num1 ^ num2 = 1010 ^ 0001 = 1011 
  2. num2 = num1 ^ num2 = 1011 ^ 0001 => 1010 => 10 
  3. num1num1 = num1 ^ num2 = 1011 ^ 1010 => 0001 => 1 

我們來看另一個例子。

  1. function swapWithXOR(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1^num2;  num2 = num1^num2;   num1num1 = num1^num2;  console.log(num1, num2) 
  4. }swapWithXOR(2.34,3.45) 
  5. // 2.34 3.45 
  6. // 3 2 

嗯?交換的值在哪里?我們只得到這個數(shù)的整數(shù)部分。這就是問題所在。異或假設輸入是整數(shù),因此執(zhí)行相應的計算。但是浮點數(shù)不是整數(shù),并且由IEEE 754標準來表示,該標準將數(shù)字分為三部分:一個符號位、一組表示指數(shù)的位以及另一組表示1(包括)到2(不包括)之間的數(shù)字尾數(shù),因此我們得到了不正確的值。

另一個例子:

  1. function swapWithXOR(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1num1 = num1^num2;  num2 = num1^num2;   num1num1 = num1^num2;  console.log(num1, num2) 
  4. }swapWithXOR(-Infinity,Infinity) 
  5. // -Infinity Infinity 
  6. // 0 0 

再一次,我們沒有看到預期的結(jié)果 。這是因為Infinity和–Infinity都是浮點數(shù)。正如我們上面討論的,對于XOR,浮點數(shù)是一個問題。

使用同或門 XNOR。

同或門也稱為異或非門,它也可以操作二進制位,與XOR相反。當我們有兩個值不一樣時,XNOR 結(jié)果是0,否則為1。JavaScript 沒有一個操作符來執(zhí)行XNOR,所以我們使用非與XOR操作符來達到類似的效果。

  1. function swapWithXNOR(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1 = ~(num1^num2)  num2 = ~(num1^num2)  num1 = ~(num1^num2)  console.log(num1, num2) 
  4. }swapWithXNOR(10,1) 
  • 4位二進制數(shù)10-> 1010
  • 4位二進制數(shù)1-> 0001

上面的分解過程 :

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

由于我們有一個負數(shù),我們需要將其轉(zhuǎn)換回二進制并執(zhí)行2的補碼以獲取十進制值,例如:

  1. -12 => 1100 => 0011 + 1 => 0100 
  1. num2 = ~(num1 ^ num2) => ~(0100 ^ 0001) => ~(0101) => ~5 => -6 
  2. -6 => 0110 => 1001 + 1 => 1010 => 10 
  1. num1 = ~(num1 ^ num2) => ~(0100^ 1010) => ~(1110) => ~14 => -15 
  2. -15 => 1111 => 0000 + 1 => 0001 => 1 

花費了一些時間,但我們交換了價值。但不幸的是,它遇到了與XOR相同的問題,它不能處理浮點數(shù)和無窮大 。

  1. function swapWithXNOR(num1, num2){ 
  2.   console.log(num1, num2) 
  3.   num1 = ~(num1^num2)  num2 = ~(num1^num2)  num1 = ~(num1^num2)  console.log(num1, num2) 
  4. }swapWithXNOR(2.3,4.5) 
  5. // 2.3 4.5 
  6. // 4 2 

8. 在數(shù)組中賦值

這是一個簡單的技巧,只需要一行來執(zhí)行交換,更重要的是不需要數(shù)學知識,只需要一個基本的數(shù)組知識即可。

  1. function swapWithArray(num1, num2){ 
  2.   console.log(num1, num2)  num2 = [num1, num1 = num2][0] 
  3.   console.log(num1, num2)}swapWithArray(2.3,Infinity)// 2.3 Infinity// Infinity 2.3 

在數(shù)組的索引0中,我們存儲num1,在索引1中,我們既將num2分配給num1,又存儲了num2。 另外,訪問[0],將數(shù)組中的num1值存儲在num2中。

這種方式可以交換我們想要的任何東西,包括整數(shù),浮點數(shù)(包括無窮大)以及字符串,它很整潔,但清晰度不夠。

9. 使用解構表達式

這是ES6的一個特性,也是最簡單的,我們可以像這樣交換值 :

  1. let num1 = 23.45 
  2. let num2 = 45.67 
  3. console.log(num1,num2) 
  4. [num1,num2] = [num2,num1]console.log(num1,num2) 

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

IIFE指的是在定義后立即執(zhí)行的函數(shù)。

  1. function swapWithIIFE(num1,num2){ 
  2.   console.log(num1,num2) 
  3.   num1 = (function (num2){ return num2; })(num2, num2=num1
  4.   console.log(num1,num2) 
  5. }swapWithIIFE(2.3,3.4) 

在上面的示例中,我們立即調(diào)用第4行上的一個函數(shù)。最后的括號是函數(shù)的參數(shù)。第二個參數(shù)將num1分配給num2,第一個參數(shù)num1被返回。因此,交換了這些值,請記住,這種交換方法效率不高。

本文轉(zhuǎn)載自微信公眾號「 大遷世界」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系****公眾號。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2020-09-19 17:31:25

JavaScript

2023-01-13 14:29:00

ESMySQL數(shù)據(jù)

2021-08-26 10:07:25

數(shù)組前端元素

2010-06-03 08:55:43

LINQ

2020-08-24 08:05:47

JavaScriptJavaScript 頁面

2020-10-13 06:56:19

JavaScript異常類型開發(fā)

2020-10-16 18:35:53

JavaScript字符串正則表達式

2018-10-26 13:57:32

交換機故障排障

2009-08-25 09:22:01

DataGridVie

2024-08-01 09:58:33

API性能機制

2020-11-16 09:15:07

MYSQL

2018-02-08 09:04:58

Nginx404頁面方法

2021-05-07 16:19:36

異步編程Java線程

2021-11-05 21:36:59

JavaScript語言開發(fā)

2010-04-01 18:22:36

無線交換機故障

2009-09-04 11:20:47

ASP.NET頁面間值

2023-09-04 08:28:34

JavaScripforEach 循環(huán)

2009-12-07 18:20:35

2022-09-06 11:01:11

交換變量前端

2020-12-31 06:12:38

Siri Windows電腦
點贊
收藏

51CTO技術棧公眾號