成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

前言

在開發(fā)過程中又是我們需要對值進行交換。一般我們都在用一種簡單的解決方案:“臨時變量”。不過還有更好的辦法,而且不只有一個,有很多。有時我們在網(wǎng)上搜尋解決方案,找到后復制粘貼,但是從沒想過這小段代碼是怎樣工作的?,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 使用算術(shù)運算符 + 和 -

還可以用一些數(shù)學魔術(shù)來交換值。

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 行獲得兩個數(shù)字的總和?,F(xiàn)在,如果從和中減去一個數(shù)字,那么另一個數(shù)字就正確了。這就是第 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)

上面的代碼給出了預期的結(jié)果。 () 中的表達式將 num2 存儲在 num1 中,然后減去 num1 - num2,除了減去 num2 - num2 = 0 之外什么也沒有做,因此得到了結(jié)果。但是當使用浮點數(shù)時,會看到一些意外的結(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 僅使用 + 或 - 運算符

僅通過使用 + 運算符就可以達到同時使用 + 和 - 相同的結(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 是返回值。簡而言之,第 4 行的運算邏輯如下所示:

num2 = num1 + 0 => num2 = num1.

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

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

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

讓我們用 * 和/ 運算符玩更多的花樣。

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

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)

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

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

不過那小問題在哪兒呢?

讓我們來嘗試一下:

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

我們的值沒有交換,而是得到了一個奇怪的 NaN,這是怎么回事。如果你還記得小學的數(shù)學課,就會想起不要除以 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 的結(jié)果與前面的代碼相同,原因也一樣。

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

下面是用 * 和 / 進行值交換的較短版本,仍存在相同的問題:

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 ** operatorswapWithMul(2.3,3.4)

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

num2 = num1 * 1 => num2 = num1

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

6 使用按位異或(XOR)。

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

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

1 的 4 位二進制數(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

兩個值交換了。

再來看另一個例子:

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ù)部分,這就是問題所在。 XOR 假定輸入是整數(shù),所以···相應地執(zhí)行計算。但是浮點數(shù)不是整數(shù),而是由 IEEE 754 標準表示的,將數(shù)字分為三部分:符號位、代表指數(shù)的一組位和代表尾數(shù)的一組位。位數(shù)是介于1(含)和2(不含)之間的數(shù)字。所以得到的值不正確。

另一個例子:

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)

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

7 使用按位同或 (XNOR)

它用來進行二進制位運算,但是與 XOR 正好相反。當有兩個不同的輸入時,XNOR 的結(jié)果是 0,否則結(jié)果為 1。 JavaScript 沒有執(zhí)行 XNOR 的運算符,所以要用 NOT 運算符對 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)}//可以試試負值swapWithXNOR(10,1)

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

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

第 4 行:

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

由于這是一個負數(shù),所以需要將其轉(zhuǎn)換回二進制并計算 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 相同的問題,不能處理浮點數(shù)和無窮大。

試試下面的值:

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ù)組中進行賦值

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

先讓看看它的實際效果:

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

在數(shù)組的下標 0 位置中存儲 num1,在下標 1 中,既將 num2 分配給 num1,又存儲了 num2。另外,我們只是訪問 [0],將數(shù)組中的 num1 值存儲在 num2 中。而且可以在這里交換我們想要的任何東西,比如:整數(shù)、浮點數(shù)(包括無窮數(shù))以及字符串??瓷先ズ苷麧崳窃谶@里失去了代碼的清晰度。

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

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

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

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

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

可以用它來交換兩個值:

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

總結(jié)

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

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

標簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
波多野结衣一区二区三区| 99v久久综合狠狠综合久久| 国产aⅴ综合色| 久久久久久黄| 有码一区二区三区| 亚洲天堂黄色| 中文字幕精品在线不卡| 91小视频免费观看| 精品国产凹凸成av人网站| 国产麻豆日韩欧美久久| 欧美色图一区二区三区| 亚洲成av人**亚洲成av**| 国产欧美亚洲日本| 亚洲天堂中文字幕| 狠狠噜噜久久| 国产日产欧美一区| www.综合网.com| 日韩免费成人网| 国产一区二区剧情av在线| 欧美男同性恋视频网站| 蓝色福利精品导航| 欧美色网一区二区| 狂野欧美性猛交blacked| 在线观看亚洲专区| 久久精品国产99国产| 欧美色综合网站| 国产在线精品一区二区三区不卡| 欧美主播一区二区三区| 久久激情五月激情| 欧美日韩另类一区| 韩国理伦片一区二区三区在线播放| 欧美视频中文字幕| 韩国三级中文字幕hd久久精品| 在线不卡欧美精品一区二区三区| 麻豆精品在线播放| 91麻豆精品国产91久久久久久久久 | 国产日韩一区二区三区| 亚洲午夜精品在线| 麻豆久久久9性大片| 青青草国产精品亚洲专区无| 欧美视频第二页| 国产成人精品一区二| 精品国精品国产尤物美女| 97久久精品人人澡人人爽| 久久久噜噜噜久噜久久综合| 国产综合网站| 亚洲一区二区三区影院| 一本大道久久a久久综合婷婷| 久久精品国产久精国产| 91精品欧美综合在线观看最新| 国产**成人网毛片九色| 亚洲国产精品成人综合色在线婷婷 | 国产凹凸在线观看一区二区| 久久影院午夜论| 亚洲国产99| 日韩电影免费一区| 在线看一区二区| 国产福利电影一区二区三区| 精品国产乱码91久久久久久网站| 国产伊人精品| 亚洲综合免费观看高清完整版| 色婷婷综合久久久中文字幕| 国产乱码精品一品二品| 久久精品一区二区| 国产亚洲欧美一区二区| 奇米影视在线99精品| 91麻豆精品国产91久久久更新时间| 99精品视频在线免费观看| 亚洲青青青在线视频| 久久婷婷麻豆| 国产99久久久久| 国产蜜臀97一区二区三区| 午夜亚洲福利在线老司机| 国产在线精品免费| 国产精品色噜噜| 色综合久久久久久久| 国产老女人精品毛片久久| 欧美极品xxx| 久久久久久久高潮| 成人性视频免费网站| 亚洲人成影院在线观看| 欧洲另类一二三四区| 91碰在线视频| 五月天丁香久久| 久久综合狠狠综合久久激情 | www.视频一区| 欧美日本在线一区| 欧美精品一级| 日韩国产一区二| 欧美一级搡bbbb搡bbbb| 欧美日韩一区二区三区免费| 午夜一区二区三区在线观看| 日韩午夜小视频| 亚洲黄色影院| 九色|91porny| 亚洲国产精品成人综合| 91黄色免费观看| 国产精品igao视频网网址不卡日韩| 日日夜夜免费精品| 日韩视频免费观看高清完整版在线观看| 国产精品二区在线观看| 伦理电影国产精品| 日本一区二区三区国色天香| 欧洲生活片亚洲生活在线观看| 欧美激情四色| 久久91精品国产91久久小草| 欧美激情综合五月色丁香| 色哟哟精品一区| 午夜电影亚洲| 蜜桃视频一区二区三区在线观看| 久久久蜜桃精品| 欧美三级欧美一级| 国内精品久久久久久久97牛牛| 久久精品国产免费| 中文字幕一区在线观看| 91麻豆精品国产91久久久使用方法 | 国产成人在线视频网站| 亚洲精品中文在线影院| 日韩欧美激情一区| 色噜噜狠狠色综合欧洲selulu| 国产一区二区三区无遮挡 | 国产一区福利在线| 一区二区三区在线观看动漫| 日韩你懂的在线播放| 久久成人一区| 91网站视频在线观看| 日韩成人av影视| 亚洲品质自拍视频| 26uuu色噜噜精品一区| 欧美日韩一区二区三区四区 | 色猫猫国产区一区二在线视频| 欧美女激情福利| 狠狠狠色丁香婷婷综合久久五月| 一区二区在线免费| 久久色.com| 欧美肥妇free| 蜜桃伊人久久| 亚洲第一在线综合在线| 成人免费视频app| 免费在线观看视频一区| 亚洲同性gay激情无套| 日韩片之四级片| 欧美亚洲国产一卡| 国产伦精品一区| 国产一区二区在线观看免费播放| 国产69精品久久777的优势| 久久国产精品区| 亚洲不卡一区二区三区| 亚洲欧洲99久久| 日本一区二区三区电影| 精品国产三级电影在线观看| 欧美日韩国产在线观看| 一本久久a久久精品亚洲| 国产精品美女| 亚洲激情不卡| 激情欧美日韩| 欧美二区视频| 91在线观看地址| 成人app网站| 成人午夜视频免费看| 国产精品自拍毛片| 久久99国产精品久久99果冻传媒| 日韩成人一区二区| 奇米影视在线99精品| 日本成人中文字幕在线视频| 香蕉久久一区二区不卡无毒影院 | 午夜亚洲福利在线老司机| 一区二区三区精品国产| 亚洲福利久久| 一色屋精品视频在线观看网站| 欧美激情在线| 欧美特黄a级高清免费大片a级| 91在线视频网址| 欧美黄免费看| 国语自产精品视频在线看抢先版结局 | 丝袜美腿一区二区三区| 亚洲大片在线观看| 亚洲国产va精品久久久不卡综合| 亚洲一区二区影院| 午夜日韩在线电影| 日韩精品国产精品| 日韩在线卡一卡二| 日韩福利电影在线| 久久66热偷产精品| 国产乱人伦偷精品视频不卡| 国内精品第一页| 国产一区二区免费在线| 国产成人夜色高潮福利影视| 国产成人a级片| 不卡的看片网站| 欧美国产先锋| 欧美日韩一区二区三| 99国产精品久久久久久久| 午夜亚洲精品| 日本高清不卡视频| 欧美日韩aaaaaa| 久久综合中文字幕| 中文欧美字幕免费| 亚洲国产va精品久久久不卡综合| 日本视频中文字幕一区二区三区|