JavaScript交换变量常用4种方法解析


Posted in Javascript onSeptember 02, 2020

许多算法需要交换2个变量。在编码面试中,可能会问您“如何在没有临时变量的情况下交换2个变量?”。我很高兴知道执行变量交换的多种方法。在本文中,您将了解大约4种交换方式(2种使用额外的内存,而2种不使用额外的内存)。

1.解构赋值

解构赋值语法(ES2015的功能)使您可以将数组的项提取到变量中。例如,以下代码对数组进行解构:

let a;
let b;

[a, b] = [1, 2, 3];

a; // => 1
b; // => 2

[a,b] = [1,2,3] 是对 [1,2,3] 数组进行解构的解构赋值。[1,2,3] 的第一项1 分配了一个变量 a,第二项 2 对应地分配了 b。

知道如何解构数组,可以很容易地使用它交换变量。让我们使用解构分配交换变量 a 和 b:

let a = 1;
let b = 2;

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

a; // => 2
b; // => 1

交换过程:

第一步,在解构的右侧,创建一个临时数组[b,a](其值为[2,1])。
然后发生临时数组的解构:[a,b] = [2,1]。变量 a 分配了 2,b 分配了 1。已经完成了 a 和 b 的交换。
我喜欢这种解构方法,因为它简短而富有表现力:交换仅用一条语句执行。它适用于任何数据类型:数字,字符串,布尔值,对象。

对于大多数情况,我建议使用解构赋值来交换变量。

2.临时变量

使用临时变量交换变量是经典的。顾名思义,这种方法需要一个额外的临时变量。

让我们使用临时变量 temp 交换变量 a 和 b 的值:

let a = 1;
let b = 2;
let temp;

temp = a;
a = b;
b = temp;

a; // => 2
b; // => 1

3.加减法

您可以交换变量而无需使用额外的内存(例如临时数组或变量)。

以下示例使用加法 + 和减法 - 算术运算符交换变量 a 和 b:

let a = 1;
let b = 2;

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

a; // => 2
b; // => 1

最初,a为1,b为2。让我们看一下 3 条语句如何执行交换:

a = a + b赋予a值1 + 2。
b = a - b为b赋值1 + 2 - 2 = 1(b现在为1)。
a = a - b为a分配值1 + 2 - 1 = 2(a现在为2)。

最后,a为2,b为1。已经完成了a和b的交换。

尽管这种方法不使用临时变量,但有很大的局限性。

首先,您只能交换整数。

其次,在第一步a = a + b进行加法时要注意数字溢出(总和必须小于Number.MAX_SAFE_INTEGER)。

4.按位XOR运算符

如果操作数不同,则 XOR 运算符的计算结果为 true。提醒一下,这是 XOR 真值表: 

JavaScript交换变量常用4种方法解析

在JavaScript中,按位 XOR 运算符 n1 ^ n2 对n1和n2数字的每一位执行 XOR 操作。

举例来说,这是 5 ^ 7 评估(evaluates)为2的方式:

1 0 1 (5 的二进制)
1 1 1 (7 的二进制)
-----
0 1 0 (5 ^ 7 = 2 的二进制)

按位 XOR 具有 2 个有趣的属性:

n ^ n = 0:对相同数字执行的按位 XOR 为0.
n ^ 0 = n:对一个数字执行按位异或,零是相同数字.

这些 XOR 属性可用于交换变量。让我们看看如何交换a和b变量:

let a = 1;
let b = 2;

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

a; // => 2
b; // => 1

交换过程:

a = a ^ b
b = a ^ b。基于1 a被a ^ b取代。因此b =(a ^ b)^ b = a ^(b ^ b)= a ^ 0 = a。请记住,现在b不是a。
a = a ^ b。基于1 a的a替换为a ^ b,基于2 b的a替换为a。因此a =(a ^ b)^ a = b ^(a ^ a)= b ^ 0 = b。变量a变为b。

如果您觉得解释很复杂,请随时跳过。由3个赋值组成的按位XOR(n ^ n = 0和n ^ 0 = n)的性质使您可以交换a和b的值。

使用按位XOR运算符交换变量有局限性:您只能交换整数。

结论

JavaScript提供了很多交换变量的好方法,无论有没有额外的内存。

  • 我建议使用的第一种方法通过应用解构赋值[a,b] = [b,a]交换变量。这是一种简短而富有表现力的方法。
  • 第二种方法使用临时变量。这是代替(applying)解构赋值方法的不错选择。
  • 第三种方法,使用加减法,不使用其他变量或内存。但是,该方法仅限于交换整数。
  • 同样,使用按位XOR的第四种方法不使用额外的内存。但是同样,您只能交换整数。

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

Javascript 相关文章推荐
js数组的基本用法及数组根据下标(数值或字符)移除元素
Oct 20 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
Oct 17 Javascript
jQuery中closest()函数用法实例
Jan 07 Javascript
浅谈Node.js中的定时器
Jun 18 Javascript
jQuery获取URL请求参数的方法
Jul 18 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
Jun 21 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
Javascript 两种刷新方法以及区别和适用范围
Jan 17 Javascript
基于JavaScript实现屏幕滚动效果
Jan 18 Javascript
深入理解vue $refs的基本用法
Jul 13 Javascript
关于express与koa的使用对比详解
Jan 25 Javascript
VUE注册全局组件和局部组件过程解析
Oct 10 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 #Javascript
Jquery $.map使用方法实例详解
Sep 01 #jQuery
JQuery基于FormData异步提交数据文件
Sep 01 #jQuery
vue实现路由懒加载的3种方法示例
Sep 01 #Javascript
JQuery使用数组遍历跳出each循环
Sep 01 #jQuery
vue+echarts实现动态折线图的方法与注意
Sep 01 #Javascript
node.js 如何监视文件变化
Sep 01 #Javascript
You might like
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
php如何获取文件的扩展名
2015/10/28 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
继续学习javascript闭包
2015/12/03 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
个人委托书怎么写
2014/09/17 职场文书
单位婚育证明范本
2014/11/21 职场文书
接待员岗位职责
2015/02/13 职场文书
谢师宴学生致辞
2015/07/27 职场文书