Yanıtlar:
İşte iki değişkenin değerlerini değiştirmek için bir astar.
Verilen değişkenler a
ve b
:
b = [a, a = b][0];
Aşağıdaki gösteri:
var a=1,
b=2,
output=document.getElementById('output');
output.innerHTML="<p>Original: "+a+", "+b+"</p>";
b = [a, a = b][0];
output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>
[a, b] = [b, a];
.
Invalid left-hand side in assignment
hata .
ES6 (Firefox ve Chrome zaten destekliyor (Yıkıcı Atama Dizisi Eşleşmesi)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Bunu yapabilirsiniz:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Okunabilirlik ve bakım kolaylığı için, bu işlem yenilmez (en azından JavaScript'te). Kodu koruyan herkes (şu andan itibaren altı ay dahil) neler olduğunu tam olarak bilecek.
Bunlar tamsayı olduğundan, üçüncü bir değişken kullanmadan takas etmek için istediğiniz sayıda akıllı numara 1 kullanabilirsiniz. Örneğin, bitsel x veya operatörünü kullanabilirsiniz:
let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);
Buna XOR takas algoritması denir. Çalışma teorisi bu Wikipedia makalesinde açıklanmıştır .
1 "Yetkili programcı kendi kafatasının sınırlı büyüklüğünün tamamen farkında. Bu nedenle görevine tam tevazu ile yaklaşıyor ve veba gibi akıllı numaralardan kaçınıyor." - Edsger W.Dijkstra
ToInt32
dahili yöntemi kullanarak - ECMAScript standardının 11.10 bölümüne bakın ). Tamsayı olmayan sayısal değerler için doğru sonuçları üretmez. Ayrıca sayısal olmayan değerleri 32 bit tamsayılara dönüştürür. Eğer başlarsanız a = "hi"
ve b = "there"
, ile sona a == 0
ve b == 0
.
typeof a == 'boolean'
veya a === false
örneğin çalışmaz . Gerçek sayılar çalışır, ancak en yakın tamsayıya yuvarlanmış olarak sıfıra doğru katlanırlar.
Aşağıdaki kodu kullanmayın. İki değişkenin değerlerini değiştirmek için önerilen yol bu değildir ( bunun için geçici bir değişken kullanın ). Sadece bir JavaScript numarası gösterir.
Bu çözümde geçici değişkenler, diziler kullanılmaz, yalnızca bir ek kullanılır ve hızlıdır . Aslında, bazen birkaç platformdaki geçici bir değişkenden daha hızlıdır .
Tüm sayılar için çalışır, asla taşmaz ve Infinity ve NaN gibi kenar durumlarını işler.
a = b + (b=a, 0)
İki adımda çalışır:
(b=a, 0)
setler b
eski değerine a
ve verim0
a = b + 0
a
eski değerine ayarlanırb
,
ve öncelik hakkını ayarlamak için kaydırılmıştır. Virgül operatörü her iki bağımsız değişkenini de (bu durumda b=a
ve 0
) değerlendirir ve sonuncusunu (bu durumda 0
) döndürür . Yani burada, yeniyi verirken b
eski değerini eski değerine ayarlama etkisi vardır . a
0
Burada tek liner varsayılarak var a
ve b
zaten var ve takas edilmesi gerek değerlere sahiptir:
var c=a, a=b, b=c;
@Kay'ın belirttiği gibi, bu aslında dizi yolundan daha iyi performans gösterir (neredeyse 2 kat daha hızlı).
var a, b, tmp;
a = 1
:; b = 2
; tmp=a, a=b, b=tmp;
Kişisel zevk.
ES6 + yöntemi: ES6'dan beri değişkenleri daha zarif bir şekilde değiştirebilirsiniz. Yıkıcı atama dizisi eşleşmesini kullanabilirsiniz. Basitçe. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Sonunda şunları yapabilirsiniz:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Geçici bir takas değişkeni veya XOR kullanabilirsiniz.
a = a ^ b
b = a ^ b
a = a ^ b
Bu sadece temel bir mantıksal kavramdır ve XOR çalışmasını destekleyen her dilde çalışır.
edit: Yorumlara bakın. Bunun sadece tamsayı ile çalıştığını söylemeyi unuttum. Sorunun evresinden tamsayı değişkenleri olduğu varsayıldı
ES6 yıkım atamasını şu şekilde kullanabilirsiniz :
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Sorunuz değerli olduğu için "Sadece bu değişkenler, herhangi bir nesne değil.", Cevap da değerli olacaktır:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
bu bir hile
Ve Rodrigo Assis'in dediği gibi "daha kısa olabilir"
b=a+(a=b)-b;
ES6 Yıkım:
Dizi kullanma: [a, b] = [b, a]; // my favorite
Bir nesne kullanma: {a, b} = {a:b, b:a}; // not bad neither
Bu klasik onelinerleri nasıl özleyebiliriz?
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Ve
var a = 1, b = 2
a = (_=b,b=a,_);
Sonuncusu '_' genel değişkenini ortaya koyar, ancak tipik javascript kuralı 'umurumda değil' değişkeni olarak kullanmak önemli değildir.
a = (_=b,b=a,_);
_
geliyor? Neden beyan edilmesine gerek yok?
Burada bir tür olimpiyat programlaması görüyorum. Bir tane daha zor tek satırlık çözüm:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, sadece yap b = (function (x){ return x; })(a, a=b)
.
arguments
liste de bir değişken olacaktır.
a
için arguments[0]
bir parametre olarak geçirerek.
arguments
ve
var a = 5;
var b = 10;
b = [a, a = b][0];
//or
b = [a, a = b];
b = b[0];
//or
b = [a, b];
a = b[1];
b = b[0];
alert("a=" + a + ',' + "b=" + b);
2 // veya'ları kaldırın veya yorum yapın ve bir kod kümesiyle çalıştırın
Biz böyle değiş tokuş edebiliyoruz:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
ES6'da şimdi yıkıcı atama var ve şunları yapabilirsiniz:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
daha ayrıntılı bir yaklaşım
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
Çok basit,
daha fazla bilgi için ES6 dizi yıkım sözdizimini [y, x] = [x, y]
kullanın. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
ES5'e kadar, iki sayıyı değiş tokuş etmek için, bir temp değişkeni oluşturmanız ve daha sonra değiştirmeniz gerekir. Ancak ES6'da dizi yıkımını kullanarak iki sayıyı değiştirmek çok kolay. Örneğe bakın.
let x,y;
[x,y]=[2,3];
console.log(x,y); // return 2,3
[x,y]=[y,x];
console.log(x,y); // return 3,2
Çünkü bu yöntem daha yavaş çalışır duydum:
b = [a, a = b][0];
Değişkenlerinizi bir nesneye (veya diziye) depolamayı planlıyorsanız, bu işlev çalışmalıdır:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Kullanımı:
let test = {a: 'test 1', b: 'test 2'};
console.log(test); //output: {a: 'test 1', b: 'test 2'}
swapVars(test, 'a', 'b');
console.log(test); //output: {a: 'test 2', b: 'test 1'}
Ek parametre olmadan iki değeri değiştirmek için IIFE'yi kullanabiliriz
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
ES6 dizi yıkımı iki değişkeni değiştirmek için kullanılır. Örneğe bakın
var [x,y]=[1,2];
[x,y]=[y,x];
Aşağıdakilerle daha kolay yol:
x === 1
ve y === 2
; Ama Strüktür kırıcı sonra x
ise y
yani 2
, ve y
olduğunu x
yani 1
.
Bitwise'u kullanarak değiştir
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Tek satır Takas "kullanma Array"
[a, b] = [b, a]
(işlev (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));