假設(shè)有a=1、b=2最筒,用js交換兩個(gè)數(shù)的值贺氓,使a=2、b=1床蜘。
很簡單對(duì)吧辙培?定義一個(gè)臨時(shí)變量,交換一下a邢锯、b的值就好了扬蕊。
例:
var changeVal=function(a,b){
var temp=a;
a=b;
b=temp;
console.log(a,b)
}
changeVal(1,2);
但是,假如要求不使用臨時(shí)變量呢丹擎?只能出現(xiàn)a和b兩個(gè)變量尾抑。
有點(diǎn)頭疼對(duì)不對(duì)歇父?
沒關(guān)系,分析一下需求不難找出隱含的要求:在給a賦一個(gè)新值的同時(shí)b要等于a的初始值再愈。
既然不能定義新的變量出來榜苫,那我們完全可以借助a\b中轉(zhuǎn)一下,最終結(jié)果滿足要求即可翎冲。而作為中轉(zhuǎn)的a\b必然要保存的是a和b的原始值垂睬。什么類型的數(shù)據(jù)能同時(shí)保存多個(gè)變量呢?數(shù)組是很容易想到的抗悍。
所以就有了下面這個(gè)方法:
var changeVal=function(a,b){
//借用a中轉(zhuǎn)驹饺,給a賦值為一個(gè)數(shù)組(該數(shù)組保存了a和b的初始值)
a=[a,b];
b=a[0];//也即是b=a,但是不會(huì)影響數(shù)組a中的b
a=a[1];//再次給a賦值
console.log(a,b)
}
changeVal(1,2)
除了數(shù)組可以同時(shí)保存多個(gè)變量,對(duì)象也是可以的缴渊。
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作為中轉(zhuǎn)變量來存儲(chǔ)a和b的初始值逻淌。但是,就算a和b的值在得到最終結(jié)果前都變了又有什么關(guān)系疟暖?只要最終結(jié)果滿足需求即可。從此思路出發(fā)得到另一個(gè)方法田柔。如下:
var changeVal=function(a,b){
//給a賦了一個(gè)新值
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);
換幾組數(shù)據(jù)試一試硬爆,你會(huì)發(fā)現(xiàn)也是ok的欣舵。
這個(gè)思路考慮乘除法?假如其中一個(gè)值是0不就完了?!所以還是算了吧缀磕。
來看看我們的題目缘圈,換種表達(dá)方式也就是讓[a,b]變成[b,a]。
在ES6中有一個(gè)數(shù)組解構(gòu)方法袜蚕。語法示例:
let [item1, item2, ...item] = arr;
其中糟把,item1,item2表示對(duì)應(yīng)索引值的成員。
而等號(hào)兩邊剛好不就可以看成各是一個(gè)數(shù)組嗎牲剃?
于是就有了下面的方法:
var changeVal=function(a,b){
//直白一點(diǎn)講遣疯,就是把等號(hào)右邊的數(shù)組的每一項(xiàng)的值賦值給等號(hào)左邊的數(shù)組的每一項(xiàng),索引值一一對(duì)應(yīng)
[a,b]=[b,a]
console.log(a,b);
}
changeVal(1,2)
百度到了一個(gè)方法凿傅,就一行代碼缠犀,簡單粗暴:
a = [b,b=a][0];
看是看明白了,但是吧擱我自個(gè)是想不出來的聪舒。很牛啊辨液,崇拜!O洳小滔迈!
小伙伴們還有別的方法的話記得分享哦!