詳解JS幾種變量交換方式以及性能分析對(duì)比
前言
“兩個(gè)變量之間的值得交換”,這是一個(gè)經(jīng)典的話題,現(xiàn)在也有了很多的成熟解決方案,本文主要是列舉幾種常用的方案,進(jìn)行大量計(jì)算并分析對(duì)比。
起由
最近做某個(gè)項(xiàng)目時(shí),其中有一個(gè)需求是交換數(shù)組中的兩個(gè)元素。當(dāng)時(shí)使用的方法是:
arr = [item0,item1,...,itemN]; //最初使用這段代碼來(lái)交換第0個(gè)和第K(k<N)個(gè)元素 arr[0] = arr.splice(k, 1, arr[0])[0];
當(dāng)時(shí)覺得這種方法很優(yōu)雅,高逼格。。。
后來(lái),業(yè)余時(shí)間又拿這個(gè)研究下了,順帶自己寫了個(gè)分析工具,和普通方式進(jìn)行對(duì)比。
結(jié)果,大大的出乎我的意料,這種方式的效率比我想象的要低的多。以下是其中一個(gè)測(cè)試結(jié)果的圖
于是,基于這點(diǎn),又研究了下其它的幾種數(shù)值交換的方式,一起整合進(jìn)入了分析工具中,才有了本文的這次總結(jié)。
JS變量交換的幾種方式
其實(shí)關(guān)于JS的變量交換,使用最廣泛的幾種方式基本已經(jīng)是前端人員必備的技能了,本文正好借此分析研究的契機(jī),列舉了本次分析中用到的幾種交換方式:
第一種:普通臨時(shí)變量交換方式
適用性: 適用于所有類型
代碼如下:
tmp = a; a = b; b = tmp;
簡(jiǎn)要說(shuō)明:
這是用到的最廣泛的一種方式,經(jīng)實(shí)戰(zhàn)測(cè)試分析,性能也很高
(在JS中,這種方式效率確實(shí)很高,而且就算是其它語(yǔ)言中,只要tmp變量提前創(chuàng)建,性能也不會(huì)很低,反而是一些雜技派和少數(shù)派性能方面很低)
基本上可以說(shuō): 經(jīng)典的才是最優(yōu)雅的
第二種:利用一個(gè)新的對(duì)象來(lái)進(jìn)行數(shù)據(jù)交換
適用性: 適用于所有類型
代碼如下:
a = {a : b, b : a};
b = a.b
;a = a.a;
簡(jiǎn)要說(shuō)明:
這種方式在實(shí)戰(zhàn)中應(yīng)用的很少
第三種:利用一個(gè)新的數(shù)組來(lái)進(jìn)行數(shù)據(jù)交換
適用性: 適用于所有類型
代碼如下:
a = [b, b=a][0];
簡(jiǎn)要說(shuō)明:
這種方式在各大論壇中都有看到有人使用,但經(jīng)測(cè)試實(shí)際性能并不高
第四種:利用數(shù)組交換變量(需EJS支持)
適用性: 適用于所有類型
代碼如下:
`[a, b] = [b, a];
簡(jiǎn)要說(shuō)明:
這也是在ES6出來(lái)后看到有人用的,實(shí)際在現(xiàn)有的瀏覽器中測(cè)試,性能很低
第五種:利用try catch交換
適用性: 適用于所有類型
代碼如下:
a=(function(){;
try{return b}
finally{b=a}}
)();
簡(jiǎn)要說(shuō)明:
這種方法應(yīng)該是基本沒人使用的,也沒有什么實(shí)用性,而且性能也是屬于在各種方法中墊底的
第六種:異或操作交換變量第一種方式
適用性: 適用于數(shù)字或字符串
代碼如下:
a = (b = (a ^= b) ^ b) ^ a;
簡(jiǎn)要說(shuō)明:
異或方法在數(shù)字或字符串時(shí)用到的比較普遍,而且性能也不低
第七種:異或操作交換變量第二種方式
適用性: 適用于數(shù)字或字符串
代碼如下:
a ^=b; b ^=a; a ^=b;
簡(jiǎn)要說(shuō)明:
異或方法在數(shù)字或字符串時(shí)用到的比較普遍,而且性能也不低
第八種:數(shù)字之間的加減運(yùn)算來(lái)實(shí)現(xiàn),第一種加減方式
適用性: 僅適用于數(shù)字
代碼如下:
a = a + b; b = a - b; a = a - b;
簡(jiǎn)要說(shuō)明:
這種用法在只用于數(shù)字間的交換時(shí),性能也不弱
第九種:數(shù)字之間的加減運(yùn)算來(lái)實(shí)現(xiàn),第一種加減方式
適用性: 僅適用于數(shù)字
代碼如下:
a = b -a +(b = a);
簡(jiǎn)要說(shuō)明:
這種用法在只用于數(shù)字間的交換時(shí),性能也不弱
第十種:利用eval計(jì)算
適用性: 僅適用于數(shù)字和字符串
代碼如下:
eval("a="+b+";b="+a);
簡(jiǎn)要說(shuō)明:
這種方式僅用于研究,實(shí)戰(zhàn)慎用
這種模式執(zhí)行一萬(wàn)次耗時(shí)等于其它執(zhí)行一億次...
第十一種:數(shù)組中,利用splice交換兩個(gè)元素的位置
適用性: 僅適用于數(shù)組元素
代碼如下:
arr[0] = arr.splice(2, 1, arr[0])[0];
簡(jiǎn)要說(shuō)明:
這種方式看起來(lái)挺優(yōu)雅的,但實(shí)際上性能遠(yuǎn)遠(yuǎn)比不上臨時(shí)變量那種
各種交換方式的性能對(duì)比
上述列舉了幾種方式都有一一做過(guò)對(duì)比分析,基本上可以得出的結(jié)論是:
還是老老實(shí)實(shí)的用回臨時(shí)變量交換吧,經(jīng)典,優(yōu)雅,而且保證不會(huì)出什么幺蛾子
性能對(duì)比截圖
分析結(jié)果1
以下截圖中的數(shù)據(jù)是,在chrome中運(yùn)行了一億次后得出的結(jié)論(每次運(yùn)行100萬(wàn)次,一共100個(gè)循環(huán),得到的分析結(jié)果)
可以看出,tmp變量交換最快,try catch最慢
分析結(jié)果2
以下截圖數(shù)據(jù)是,在chrome (支持es6)中運(yùn)行了100萬(wàn)次后得出的結(jié)論(每次運(yùn)行1萬(wàn)次,一共100個(gè)循環(huán),得到的分析結(jié)果)
可以看出,eval最慢,splice性能較低,tmp變量交換很穩(wěn)定
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript模板引擎應(yīng)用場(chǎng)景及實(shí)現(xiàn)原理詳解
這篇文章主要介紹了JavaScript模板引擎應(yīng)用場(chǎng)景及實(shí)現(xiàn)原理,結(jié)合實(shí)例形式詳細(xì)分析了javascript模版引擎的具體應(yīng)用場(chǎng)景、實(shí)現(xiàn)原理、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12
javascript設(shè)計(jì)模式之中介者模式學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了javascript設(shè)計(jì)模式之中介者模式學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
JS實(shí)現(xiàn)隨機(jī)亂撞彩色圓球特效的方法
這篇文章主要介紹了JS實(shí)現(xiàn)隨機(jī)亂撞彩色圓球特效的方法,可實(shí)現(xiàn)彩色小球的碰撞效果,涉及隨機(jī)函數(shù)與頁(yè)面樣式的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
微信小程序scroll-view點(diǎn)擊項(xiàng)自動(dòng)居中效果的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序scroll-view點(diǎn)擊項(xiàng)自動(dòng)居中效果的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
bootstrap treeview 擴(kuò)展addNode方法動(dòng)態(tài)添加子節(jié)點(diǎn)的方法
bootstrap-treeview 是一款基于Jquery+bootstrap的樹控件,這篇文章主要介紹了bootstrap treeview 擴(kuò)展addNode方法動(dòng)態(tài)添加子節(jié)點(diǎn)的方法,需要的朋友可以參考下2017-11-11
JavaScript連接組件實(shí)現(xiàn)打印功能
這篇文章主要為大家詳細(xì)介紹了JavaScript如何連接連接抖音打印組件實(shí)現(xiàn)打印小票功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-04-04

