详解JS几种变量交换方式以及性能分析对比


Posted in Javascript onNovember 25, 2016

前言

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

起由

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

arr = [item0,item1,...,itemN];
//最初使用这段代码来交换第0个和第K(k<N)个元素
arr[0] = arr.splice(k, 1, arr[0])[0];

当时觉得这种方法很优雅,高逼格。。。

后来,业余时间又拿这个研究下了,顺带自己写了个分析工具,和普通方式进行对比。

结果,大大的出乎我的意料,这种方式的效率比我想象的要低的多。以下是其中一个测试结果的图详解JS几种变量交换方式以及性能分析对比

于是,基于这点,又研究了下其它的几种数值交换的方式,一起整合进入了分析工具中,才有了本文的这次总结。

JS变量交换的几种方式

其实关于JS的变量交换,使用最广泛的几种方式基本已经是前端人员必备的技能了,本文正好借此分析研究的契机,列举了本次分析中用到的几种交换方式:

第一种:普通临时变量交换方式

适用性: 适用于所有类型

代码如下:

tmp = a;
a = b;
b = tmp;

简要说明:

这是用到的最广泛的一种方式,经实战测试分析,性能也很高

(在JS中,这种方式效率确实很高,而且就算是其它语言中,只要tmp变量提前创建,性能也不会很低,反而是一些杂技派和少数派性能方面很低)

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

第二种:利用一个新的对象来进行数据交换

适用性: 适用于所有类型

代码如下:

a = {a : b, b : a};
b = a.b
;a = a.a;

简要说明:

这种方式在实战中应用的很少

第三种:利用一个新的数组来进行数据交换

适用性: 适用于所有类型

代码如下:

a = [b, b=a][0];

简要说明:

这种方式在各大论坛中都有看到有人使用,但经测试实际性能并不高

第四种:利用数组交换变量(需EJS支持)

适用性: 适用于所有类型

代码如下:

`[a, b] = [b, a];

简要说明:

这也是在ES6出来后看到有人用的,实际在现有的浏览器中测试,性能很低

第五种:利用try catch交换

适用性: 适用于所有类型

代码如下:

a=(function(){;
  try{return b}
  finally{b=a}}
)();

简要说明:

这种方法应该是基本没人使用的,也没有什么实用性,而且性能也是属于在各种方法中垫底的

第六种:异或操作交换变量第一种方式

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

代码如下:

a = (b = (a ^= b) ^ b) ^ a;

简要说明:

异或方法在数字或字符串时用到的比较普遍,而且性能也不低

第七种:异或操作交换变量第二种方式

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

代码如下:

a ^=b;
b ^=a;
a ^=b;

简要说明:

异或方法在数字或字符串时用到的比较普遍,而且性能也不低

第八种:数字之间的加减运算来实现,第一种加减方式

适用性: 仅适用于数字

代码如下:

a = a + b;
b = a - b; 
a = a - b;

简要说明:

这种用法在只用于数字间的交换时,性能也不弱

第九种:数字之间的加减运算来实现,第一种加减方式

适用性: 仅适用于数字

代码如下:

a = b -a +(b = a);

简要说明:

这种用法在只用于数字间的交换时,性能也不弱

第十种:利用eval计算

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

代码如下:

eval("a="+b+";b="+a);

简要说明:

这种方式仅用于研究,实战慎用

这种模式执行一万次耗时等于其它执行一亿次...

第十一种:数组中,利用splice交换两个元素的位置

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

代码如下:

arr[0] = arr.splice(2, 1, arr[0])[0];

简要说明:

这种方式看起来挺优雅的,但实际上性能远远比不上临时变量那种

各种交换方式的性能对比

上述列举了几种方式都有一一做过对比分析,基本上可以得出的结论是:

还是老老实实的用回临时变量交换吧,经典,优雅,而且保证不会出什么幺蛾子

性能对比截图

分析结果1

以下截图中的数据是,在chrome中运行了一亿次后得出的结论(每次运行100万次,一共100个循环,得到的分析结果)详解JS几种变量交换方式以及性能分析对比

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

分析结果2

以下截图数据是,在chrome (支持es6)中运行了100万次后得出的结论(每次运行1万次,一共100个循环,得到的分析结果)详解JS几种变量交换方式以及性能分析对比

 可以看出,eval最慢,splice性能较低,tmp变量交换很稳定

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 提交和设置表单的值
Dec 19 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
Feb 26 Javascript
基于jquery的一个拖拽到指定区域内的效果
Sep 21 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
JavaScript实现页面跳转的方式汇总
May 16 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
JavaScript基础进阶之数组方法总结(推荐)
Sep 04 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
May 24 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
深入浅析Vue组件开发
Nov 25 #Javascript
javascript中href和replace的比较(详解)
Nov 25 #Javascript
移动适配的几种方案(三种方案)
Nov 25 #Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
Nov 25 #Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 #Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 #Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 #Javascript
You might like
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php预定义常量
2006/12/25 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
Django与JS交互的示例代码
2017/08/23 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
党支部四风整改方案
2014/10/25 职场文书
宪法宣传标语100条
2019/10/15 职场文书
关于Redis的主从复制及哨兵问题
2022/06/16 Redis
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript