手机版

详细说明几种变量交换方法以及JS的性能分析和比较

时间:2021-09-11 来源:互联网 编辑:宝哥软件园 浏览:

“两个变量的交换值不值”,这是一个经典话题。现在有很多成熟的解决方案。本文主要列举了几种常用的解决方案,并进行了大量的计算、分析和比较。

起源

最近在做一个项目的时候,其中一个要求是交换数组中的两个元素。当时使用的方法是:

arr=[项目0,项目1,ItemN];//使用此代码交换第0个和第K(kN)个元素arr [0]=arr。split (k,1,arr[0])[0];当时我觉得这个方法优雅有力。

后来,我在业余时间再次进行了这项研究,并自己编写了一个分析工具,与常用的方法进行比较。

结果,令我非常惊讶的是,这种方法的效率比我想象的要低得多。以下是一个测试结果的图表

因此,基于这一点,对其他几种数值交换方法进行了研究,并将其整合到分析工具中,从而对本文进行了总结。

JS变量交换的几种方式

其实关于JS变量交换,应用最广泛的方法基本都是前端人员必备的技能。本文正是借分析研究的机会,列举了本次分析中使用的几种交换方法。

第一个:常见的临时变量交换方法

适用性3360适用于所有类型

代码如下:

tmp=a;a=b;b=tmp简要说明:

这是应用最广泛的方法,经过实际测试和分析,性能也很高

(在JS中,这种方法非常高效,即使在其他语言中,只要提前创建tmp变量,性能也不会很低,但是有些杂技演员和少数民族的性能就很低。)

基本上可以说:经典是最优雅的

第二个:使用新对象进行数据交换

适用性3360适用于所有类型

代码如下:

a={a : b,b : a };b=a.ba=a.a简要说明:

这种方法在实战中很少使用

第三个:使用新阵列进行数据交换

适用性3360适用于所有类型

代码如下:

a=[b,b=a][0];简要说明:

这种方法在各大论坛都有使用,但测试后实际性能不高

第四个:使用数组来交换变量(EJS支持)

适用性3360适用于所有类型

代码如下:

`[a,b]=[b,a];简要说明:

ES6出来后也有人用这个。实际上,它是在现有的浏览器中测试的,性能非常低

第五个:使用尝试捕获交换

适用性3360适用于所有类型

代码如下:

a=(函数(){;尝试{return b}最后{ b=a } })();简要说明:

这个方法应该是基本不用的,不实用的,它的性能在所有方法中是垫底的

第六个:异或运算以第一种方式交换变量

适用性3360适用于数字或字符串

代码如下:

a=(b=(a ^=b)^ b)^ a;简要说明:

异或方法广泛应用于数字或字符串,性能不低

第七个:异或运算以第二种方式交换变量

适用性3360适用于数字或字符串

代码如下:

一个^=b;^=a;一个^=b;简要说明:

异或方法广泛应用于数字或字符串,性能不低

:数字之间的第八次加减,第一次加减

适用性:仅适用于数字

代码如下:

a=a b;b=a-b;a=a-b;简要说明:

当它仅用于数字交换时,这种用法并不弱

:个数之间的第九次加减运算,第一次加减方法

适用性:仅适用于数字

代码如下:

a=B- a(b=a);简要说明:

当它仅用于数字交换时,这种用法并不弱

第十个:由eval计算

适用性3360仅适用于数字和字符串

代码如下:

eval(' a=' b ';b=' a ';简要说明:

这种方法只用于研究,在实战中慎用

这种模式执行一万次,相当于其他执行一亿次.

在第十一个:阵列中,拼接用于交换两个元素的位置

适用性3360仅适用于数组元素

代码如下:

arr[0]=arr.splice(2,1,arr[0])[0];简要说明:

这种方式看似优雅,但实际上表现远不如临时变量

各种交换方法的性能比较

对上述方法进行了逐一对比分析,结论基本可以:

让我们诚实地用临时变量来交换它,经典的,优雅的,并保证什么都不会发生。

性能对比截图

分析结果1

下面截图中的数据是在chrome中运行1亿次后得出的结论(每次运行100万次,共100个周期,得出的分析结果)

可以看出,tmp变量交换最快,try catch最慢

分析结果2

以下截图数据是在chrome中运行100万次后得出的结论(支持es6)(每次运行10000次,共100个周期,得出的分析结果)

可以看出,eval最慢,拼接性能低,tmp变量交换稳定

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:详细说明几种变量交换方法以及JS的性能分析和比较是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。