假设有a=1、b=2,用js交换两个数的值,使a=2、b=1。
很简单对吧?定义一个临时变量,交换一下a、b的值就好了。
例:
var changeVal=function(a,b){
var temp=a;
a=b;
b=temp;
console.log(a,b)
}
changeVal(1,2);
但是,假如要求不使用临时变量呢?只能出现a和b两个变量。
有点头疼对不对?
没关系,分析一下需求不难找出隐含的要求:在给a赋一个新值的同时b要等于a的初始值。
既然不能定义新的变量出来,那我们完全可以借助a\b中转一下,最终结果满足要求即可。而作为中转的a\b必然要保存的是a和b的原始值。什么类型的数据能同时保存多个变量呢?数组是很容易想到的。
所以就有了下面这个方法:
var changeVal=function(a,b){
//借用a中转,给a赋值为一个数组(该数组保存了a和b的初始值)
a=[a,b];
b=a[0];//也即是b=a,但是不会影响数组a中的b
a=a[1];//再次给a赋值
console.log(a,b)
}
changeVal(1,2)
除了数组可以同时保存多个变量,对象也是可以的。
var changeVal=function(a,b){
a={a:a,b:b};
b=a.a;
a=a.b;
console.log(a,b)
}
changeVal(1,2)
上面的方法是借助a\b作为中转变量来存储a和b的初始值。但是,就算a和b的值在得到最终结果前都变了又有什么关系?只要最终结果满足需求即可。从此思路出发得到另一个方法。如下:
var changeVal=function(a,b){
//给a赋了一个新值
a=a+b;//3
//b=a也即是b=a+b-b;
b=a-b;//1
//a要得到2,2=3-1,也即是a=a-b
a=a-b;
console.log(a,b);
}
changeVal(1,2);
换几组数据试一试,你会发现也是ok的。
这个思路考虑乘除法?假如其中一个值是0不就完了?!所以还是算了吧。
来看看我们的题目,换种表达方式也就是让[a,b]变成[b,a]。
在ES6中有一个数组解构方法。语法示例:
let [item1, item2, ...item] = arr;
其中,item1,item2表示对应索引值的成员。
而等号两边刚好不就可以看成各是一个数组吗?
于是就有了下面的方法:
var changeVal=function(a,b){
//直白一点讲,就是把等号右边的数组的每一项的值赋值给等号左边的数组的每一项,索引值一一对应
[a,b]=[b,a]
console.log(a,b);
}
changeVal(1,2)
百度到了一个方法,就一行代码,简单粗暴:
a = [b,b=a][0];
看是看明白了,但是吧搁我自个是想不出来的。很牛啊,崇拜!!!
小伙伴们还有别的方法的话记得分享哦!