详解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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
理解Javascript_02_理解undefined和null
Oct 11 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
Nov 25 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
Jul 02 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
十个免费的web前端开发工具详细整理
Sep 18 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 Javascript
javascript执行上下文、变量对象实例分析
Apr 25 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
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
Python 实现数组相减示例
2019/12/27 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
质量保证书
2015/01/17 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
Python echarts实现数据可视化实例详解
2022/03/03 Python